2013-03-06 71 views
12

这将返回true:空数组是假的,但在IF语句返回true

[] == false 

但在这里,警报被称为:

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

你能解释一下为什么吗?

+2

通过你最近回答了这个问题的启发,胡? :) – dfsq 2013-03-06 06:28:17

+0

@dfsq是的,你是对的:D – karaxuna 2013-03-06 06:28:57

+0

好问题,但不要与两种情况下比较的东西混淆。检查由@Kobi提供的链接。 – dfsq 2013-03-06 06:32:57

回答

9

这是因为==在JS力转换,并且如果一个类型可以转换到另一个的返回值是true,在这里,因为[]不能被改变或比较用布尔它是假

其中作为if([])检查nullundefined价值观和因为[既不是null或undefined则返回true

检查这个 Which equals operator (== vs ===) should be used in JavaScript comparisons?

+1

“==转换力量”并不严格;另外,'if'检查的不仅仅是'null'或'undefined'。 – 2013-03-06 06:55:35

13

按照的section 11.9.3

  1. 如果Type(x)是相同类型(Y),然后
    1. 如果Type(x)是未定义,返回true:3210,如下任何==比较完成的。
    2. 如果Type(x)为Null,则返回true。
    3. 如果类型(x)是数字,则
      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. 返回false。
    4. 如果Type(x)是String,那么如果x和y是完全相同的字符序列(相同长度和相同位置中的相同字符),则返回true。否则,返回false。
    5. 如果Type(x)是布尔值,如果x和y均为真或假都返回true。否则,返回false。
    6. 如果x和y引用同一个对象,则返回true。否则,返回false。
  2. 如果x为空,y是不确定的,返回true。
  3. 如果x未定义且y为null,则返回true。
  4. 如果Type(x)是数目和类型(y)为字符串,返回 比较X == ToNumber(Y)的结果。
  5. 如果Type(x)是字符串和类型(y)为数量, 返回的比较ToNumber(X)== y的结果。
  6. 如果Type(x)是布尔型,则返回比较结果ToNumber(x)== y。
  7. 如果Type(y)为布尔型,返回的比较X == ToNumber(Y)的结果。
  8. 如果Type(x)是String或数目和类型(y)为对象, 返回的比较X == ToPrimitive(Y)的结果。
  9. 如果Type(x)是Object且Type(y)是String或Number,则 将返回比较结果ToPrimitive(x)== y。
  10. 返回false。

在第一步骤中,ToNumber()被施加到false和产量Number(0)。在第二步中,规则#9将ToPrimitive()应用于空数组,并产生"",该数值转换为数字值也变为Number(0)

此外section 9.2说,这大约在表达式中使用的对象:

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

  • 未定义 - > false
  • Null - > false
  • 布尔 - >结果等于in把参数(不转换)。
  • Number - >如果参数为+0,-0或NaN,则结果为false;否则结果是真的。
  • String - >如果参数是空字符串(其长度为零),则结果为false;否则结果是真的。
  • 对象 - >真