1
在NodeJs
控制台,使用一个非空对象的非严格比较true
或false
我总是得到false
。为什么?为什么一个空的javascript对象既不是真也是假?
> ({}) == true || ({}) == false
false
在NodeJs
控制台,使用一个非空对象的非严格比较true
或false
我总是得到false
。为什么?为什么一个空的javascript对象既不是真也是假?
> ({}) == true || ({}) == false
false
因为您正在比较对象与布尔值。因为你没有使用类型安全的比较,所以事情变得复杂。
Booleans get compared to other types就好像它们是数字,即true
浇铸到1
第一和false
到0
。然后,当一个对象与一个数字进行比较时,它将被播出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
+1,并感谢您的链接。 – 2014-09-24 11:06:37
准确地说,'[object Object]'也会被转换为Number(与布尔值相比),在处理中变成'NaN'。 “NaN”显然无与伦比。 )简短的经验法则:如有疑问,请添加字符串,比较数字。不过,比较对象和基元时最好不要使用'=='。 – raina77ow 2014-09-24 11:16:05
@ raina77ow:是的,具体取决于'DefaultValue'操作(即对象的'toString' /'valueOf'方法)产生的值。如果这是一个字符串或布尔值,它将被解析为与'0'或'1'相当的数字。 – Bergi 2014-09-24 11:19:15