我发现了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
为什么会这样?
答案 0 :(得分:6)
此行为在The Abstract Equality Comparison Algorithm
的规范中来自规范
比较x == y
,其中x
和y
是值,会产生真或假。这样的比较如下进行:
如果Type(x)
与Type(y)
相同,则......
...
如果x
为空并且y
未定义,则返回true。
x
未定义且y
为null
,则返回true。 Type(x)
为数字且Type(y)
为字符串,则返回comparison x == ToNumber(y)
的结果。Type(x)
为字符串且Type(y)
为数字,则返回比较结果ToNumber(x) == y
。Type(x)
为布尔值,则返回比较结果ToNumber(x) == y
。Type(y)
为布尔值,则返回比较结果x == ToNumber(y)
。Type(x)
是字符串或数字且Type(y)
是对象,则返回comparison x == ToPrimitive(y)
的结果。Type(x)
是对象且Type(y)
是字符串或数字,则返回比较结果ToPrimitive(x) == y
。由于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等等。