2016-11-15 248 views
4

我在发现JavaScript比较的几率。我想找到一个比较棘手的例子,以及在某些情况下如何导致错误。为什么在JavaScript中undefined不等于零?

我想过一些输入变量保持未定义的例子,并将其与零比较。因为不确定是假的时,转换为布尔和零为假时,转换为布尔我决定测试一下下面的代码:

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 

为什么它是这样呢?

+5

既然'1'和'2'都是真的,你会期望'1 == 2'是'true'吗? –

+2

你期待什么样的答案超越“因为规格说明”? http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3 – Quentin

+0

那么'未定义!= 0',我想那就是它。请参阅此处以获取JS比较的完整列表:https://dorey.github.io/JavaScript-Equality-Table/ –

回答

6

此行为是在本说明书中对于The Abstract Equality Comparison Algorithm

从说明书

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

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

  2. 如果x为null,并且y是不确定的,返回true。

  3. 如果x未定义,并且ynull,则返回true。
  4. 如果Type(x)是Number并且Type(y)是String,则返回comparison 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)是字符串或数字,并且Type(y)是Object,则返回comparison x == ToPrimitive(y)的结果。
  9. 如果Type(x)是Object且Type(y)是字符串或数字,则返回比较结果ToPrimitive(x) == y
  10. 返回false。

由于undefined等一批0是不是同一类型的,它只是在第三点提到它做什么,如果左边是undefined
然后,如果右侧是null,它将返回任何其他值,并直接输入10.,它将显示“return false”。

+0

哇!太棒了。如果我将未定义的变量与已知“已知类型”(可以这么说)的任何变量进行比较,它会尝试将undefined转换为该类型吗? – Landeeyo

+1

@Landeeyo - 实际上不是,它有点复杂,规范有这个答案,我发布了一些草率,让我编辑。 – adeneo

+0

这部分规范是惊人的。很好的答案。万分感谢! – Landeeyo

-6

这不是深刻的平等。 如果要比较的价值,你可以使用类型三重“=”

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

否则未定义== NULL等。

+0

这并不回答问题。 –

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

实际上,Boolean函数返回false所有非真实值,如0,null,未定义 “”(空字符串)等

这并不意味着undefined == 0

相关问题