空数组为false,但在IF语句中返回true

时间:2013-03-06 06:26:34

标签: javascript arrays

返回true:

[] == false

但是在这里,警告被称为:

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

你能解释一下原因吗?

2 个答案:

答案 0 :(得分:14)

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

  1. 如果Type(x)与Type(y)相同,那么
    1. 如果Type(x)为Undefined,则返回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. 返回false。
    4. 如果Type(x)是String,则如果x和y完全相同的字符序列(相应位置的长度和字符相同),则返回true。否则,返回false。
    5. 如果Type(x)是布尔值,如果x和y都为true或两者都为false,则返回true。否则,返回false。
    6. 如果x和y引用同一个对象,则返回true。否则,返回false。
  2. 如果x为null且y未定义,则返回true。
  3. 如果x未定义且y为null,则返回true。
  4. 如果Type(x)是Number而Type(y)是String, 返回比较结果x == ToNumber(y)。
  5. 如果Type(x)是String而Type(y)是Number, 返回比较结果ToNumber(x)== y。
  6. 如果Type(x)是布尔值,则返回比较结果ToNumber(x)== y。
  7. 如果Type(y)为布尔值,则返回比较结果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. 返回false。
  11. 在第一步中,ToNumber()适用于false并产生Number(0)。在第二步中,规则#9将ToPrimitive()应用于空数组并生成"",其转换为数值,也变为Number(0)

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

      

    抽象操作ToBoolean根据此表将其参数转换为Boolean类型的值:

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

答案 1 :(得分:9)

这是因为JS中的==强制转换,如果一个类型可以转换为另一个类型,则返回值为true,这里因为[]无法更改或与bool进行比较,所以false

其中if([])检查nullundefined值,因为[]既不为null也未定义,它返回true

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