为什么未定义的JavaScript在JavaScript中不等于零?

时间:2016-11-15 17:15:32

标签: javascript

我发现了JavaScript比较的可能性。我想找一个比较棘手的例子,以及在某些情况下如何导致错误。

我想到了一些输入变量未定义的示例,并将其与零进行比较。因为undefined在转换为Boolean时为false,在转换为Boolean时为0,所以我决定测试以下代码:

var x;
//Here x should be initialized but due to some circumstances is not
if(x == 0){
   //This should run
}

...令人惊奇地

Boolean(undefined) //false
Boolean(0) //false
x //undefined
x == 0 //false

为什么会这样?

3 个答案:

答案 0 :(得分:6)

此行为在The Abstract Equality Comparison Algorithm

的规范中

来自规范

比较x == y,其中xy是值,会产生真或假。这样的比较如下进行:

  1. 如果Type(x)Type(y)相同,则...... ...

  2. 如果x为空并且y未定义,则返回true。

  3. 如果x未定义且ynull,则返回true。
  4. 如果Type(x)为数字且Type(y)为字符串,则返回comparison x == ToNumber(y)的结果。
  5. 如果Type(x)为字符串且Type(y)为数字,则返回比较结果ToNumber(x) == y
  6. 如果Type(x)为布尔值,则返回比较结果ToNumber(x) == y
  7. 如果Type(y)为布尔值,则返回比较结果x == ToNumber(y)
  8. 如果Type(x)是字符串或数字且Type(y)是对象,则返回comparison x == ToPrimitive(y)的结果。
  9. 如果Type(x)是对象且Type(y)是字符串或数字,则返回比较结果ToPrimitive(x) == y
  10. 返回false。
  11. 由于undefined和数字0的类型不同,所以它只是在第三点提到了左手边做了什么是undefined 然后,如果右侧是null,则返回true,任何其他值,然后直接转到10.,其中显示“return false”。

答案 1 :(得分:0)

Boolean(undefined) //false
Boolean(0) //false

实际上,Boolean函数为所有非实数值返回false,例如0,null,undefined,“”(空字符串)等。

这并不意味着undefined == 0

答案 2 :(得分:-7)

这不是很平等。 如果要比较值和类型,可以使用三元组'='

if(x === 0){
    //This should run
}

否则undefined == null等等。