13

这返回真:

[] == false

但在这里,警报被称为:

if([]){ alert('empty array is true here'); }

你能解释一下为什么吗?

4

2 回答 2

14

根据ECMAScript® Language Specification第 11.9.3 节,任何比较都按如下方式进行:==

  1. 如果 Type(x) 与 Type(y) 相同,则
    1. 如果 Type(x) 未定义,则返回 true。
    2. 如果 Type(x) 为 Null,则返回 true。
    3. 如果 Type(x) 是 Number,那么
      1. 如果 x 是 NaN,则返回 false。
      2. 如果 y 是 NaN,则返回 false。
      3. 如果 x 与 y 的数值相同,则返回 true。
      4. 如果 x 为 +0 且 y 为 -0,则返回 true。
      5. 如果 x 为 -0 且 y 为 +0,则返回 true。
      6. 返回假。
    4. 如果 Type(x) 是 String,则如果 x 和 y 是完全相同的字符序列(相同长度和对应位置的相同字符),则返回 true。否则,返回假。
    5. 如果 Type(x) 是布尔值,如果 x 和 y 都为真或都为假,则返回真。否则,返回假。
    6. 如果 x 和 y 引用同一个对象,则返回 true。否则,返回假。
  2. 如果 x 为 null 且 y 未定义,则返回 true。
  3. 如果 x 未定义且 y 为空,则返回 true。
  4. 如果 Type(x) 是 Number 并且 Type(y) 是 String,则返回比较结果 x == ToNumber(y)。
  5. 如果 Type(x) 是 String 并且 Type(y) 是 Number,则返回比较结果 ToNumber(x) == y。
  6. 如果 Type(x) 是 Boolean,则返回比较 ToNumber(x) == y 的结果。
  7. 如果 Type(y) 是 Boolean,则返回比较结果 x == ToNumber(y)。
  8. 如果 Type(x) 是 String 或 Number 且 Type(y) 是 Object,则返回比较结果 x == ToPrimitive(y)。
  9. 如果 Type(x) 是 Object 并且 Type(y) 是 String 或 Number,则返回 ToPrimitive(x) == y 的比较结果。
  10. 返回假。

在第一步中,ToNumber()应用于false并产生Number(0)。在第二步中,规则#9 适用ToPrimitive()于空数组并产生"",转换为数值,也变成Number(0)了。

另外,第 9.2 节说明了在表达式中使用对象:

根据下表,抽象操作ToBoolean将其参数转换为布尔类型的值:

  • 未定义 -> 假
  • 空 -> 假
  • Boolean -> 结果等于输入参数(无转换)。
  • Number -> 如果参数为 +0、-0 或 NaN,则结果为 false;否则结果为真。
  • String -> 如果参数是空字符串(其长度为零),则结果为假;否则结果为真。
  • 对象->真
于 2013-03-06T06:42:30.837 回答
9

这是因为==在 JS 中强制转换,如果一种类型可以转换为另一种类型,则返回值是true,这里因为[]不能更改或与 bool 比较,所以它是 false

,其中if([])检查nullundefined值,因为 [] 既不是 null 也不是 undefined 它是返回真

检查这个 在JavaScript比较中应该使用哪个等于运算符(== vs ===)?

于 2013-03-06T06:34:56.747 回答