2014-09-24 72 views

回答

2

因为您正在比较对象与布尔值。因为你没有使用类型安全的比较,所以事情变得复杂。

Booleans get compared to other types就好像它们是数字,即true浇铸到1第一和false0。然后,当一个对象与一个数字进行比较时,它将被播出to a primitive value(没有首选类型) - 调用DefaultValue algorithm。在普通的对象,这将字符串化他们,你的空对象{} becomes"[object Object]",这既不等于0也不是1

然而,有一些对象,这将作为比较,等于布尔值,例如:

[0] == false 
[1] == true 
({toString:function(){return "1"}}) == true 
({valueOf:function(){return 0}}) == false 
({valueOf:function(){return true}}) == true 
+0

+1,并感谢您的链接。 – 2014-09-24 11:06:37

+0

准确地说,'[object Object]'也会被转换为Number(与布尔值相比),在处理中变成'NaN'。 “NaN”显然无与伦比。 )简短的经验法则:如有疑问,请添加字符串,比较数字。不过,比较对象和基元时最好不要使用'=='。 – raina77ow 2014-09-24 11:16:05

+0

@ raina77ow:是的,具体取决于'DefaultValue'操作(即对象的'toString' /'valueOf'方法)产生的值。如果这是一个字符串或布尔值,它将被解析为与'0'或'1'相当的数字。 – Bergi 2014-09-24 11:19:15

相关问题