js 空数组是true还是false

注意全篇用的是 == ,而不是 ===,双等有隐式转换的功能。

任意值与【数字值/布尔值】比较,双等情况下,会将将两边的值转化为Number,再进行比较。

  1. /**
  2. * 1、[] -> Number([]) -> 0
  3. * 2、再与右边的进行比较
  4. */
  5. [] == 0
  6. // true
  7. /**
  8. * 1、[] -> Number([]) -> 0
  9. * 2、false -> Number(false) -> 0
  10. * 3、左右边两边再进行比较
  11. */
  12. [] == false
  13. // true
  14. /**
  15. * 1、![] -> false -> Number(false) -> 0
  16. * 2、[] -> Number([]) -> 0
  17. * 3、左右边两边再进行比较
  18. */
  19. [] == ![];
  20. // true

Number([]) 为什么是 0,里边都做了什么?

实际上数组在Number之前都会执行toString()方法,将其先转换为字符串,在转换为Number。
可以参考Q2第6点

  1. Number([]) // [].toString() -> '' -> Number('') -> 0
  2. // 0
  3. Number([6]) // [6].toString() -> '6' -> Number('6') -> 6
  4. // 6
  5. Number(['7']) // [7].toString() -> '7' -> Number('7') -> 7
  6. // 7
  7. Number([6, 1]) // [6, 1].toString() -> '6,1' -> Number('6,1') -> NaN
  8. // NaN
  9. Number(['i']) // ['i'].toString() -> 'i' -> Number('i') -> NaN
  10. // NaN
  11. Number([undefined]) // [undefined].toString() -> '' -> Number('') -> 0
  12. // 0
  13. Number(new Array(1)) // new Array(1) ->[empty] -> [empty].toString() -> '' -> Number() -> false
  14. // 0