为什么空的javascript对象既不正确也不错误?

为什么空的javascript对象既不正确也不错误?,javascript,Javascript,在NodeJs控制台中,使用空对象与true或false的非严格比较,我总是得到false。为什么? > ({}) == true || ({}) == false false 因为你要把一个对象和一个布尔值进行比较。这就是事情变得复杂的原因,因为您没有使用类型安全比较 就像它们是数字一样,即true首先被转换为1,而false被转换为0。然后,当一个对象与一个数字进行比较时,它将被强制转换(没有首选类型)-调用。在普通对象上,这将字符串化它们,并且您的空对象“[object objec

NodeJs
控制台中,使用空对象与
true
false
的非严格比较,我总是得到
false
。为什么?

> ({}) == true || ({}) == false
false

因为你要把一个对象和一个布尔值进行比较。这就是事情变得复杂的原因,因为您没有使用类型安全比较

就像它们是数字一样,即
true
首先被转换为
1
,而
false
被转换为
0
。然后,当一个对象与一个数字进行比较时,它将被强制转换(没有首选类型)-调用。在普通对象上,这将字符串化它们,并且您的空对象
“[object object]”
,它既不等于0也不等于1

但是,有些对象将与布尔值进行比较,例如:

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

因为你要把一个对象和一个布尔值进行比较。这就是事情变得复杂的原因,因为您没有使用类型安全比较

就像它们是数字一样,即
true
首先被转换为
1
,而
false
被转换为
0
。然后,当一个对象与一个数字进行比较时,它将被强制转换(没有首选类型)-调用。在普通对象上,这将字符串化它们,并且您的空对象
“[object object]”
,它既不等于0也不等于1

但是,有些对象将与布尔值进行比较,例如:

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

准确地说,
[object object]
也将被转换为数字(与布尔值相比),在转换过程中变成
NaN
。而
NaN
显然是任何东西都无法比拟的。)一个简单的经验法则:当有疑问时,添加字符串,比较数字。不过,在比较对象和原语时最好不要使用
=
。@raina77ow:是的,这取决于
DefaultValue
操作(即对象的
toString
/
valueOf
方法)产生的值。如果这是一个字符串或布尔值,它将被解析为一个与
0
1
相当的数字。很好的解释。这是否会让其他人觉得JS有问题,或者我遗漏了什么?应该有一个!!对象,然后再进行此类比较?谢谢大家。不,这不是JS的问题,这是滥用它的动态类型系统的问题。人们永远不需要将对象与布尔值进行比较。你到底想做什么?准确地说,
[object object]
也将被转换为数字(与布尔值相比),并在转换过程中变成
NaN
。而
NaN
显然是任何东西都无法比拟的。)一个简单的经验法则:当有疑问时,添加字符串,比较数字。不过,在比较对象和原语时最好不要使用
=
。@raina77ow:是的,这取决于
DefaultValue
操作(即对象的
toString
/
valueOf
方法)产生的值。如果这是一个字符串或布尔值,它将被解析为一个与
0
1
相当的数字。很好的解释。这是否会让其他人觉得JS有问题,或者我遗漏了什么?应该有一个!!对象,然后再进行此类比较?谢谢大家。不,这不是JS的问题,这是滥用它的动态类型系统的问题。人们永远不需要将对象与布尔值进行比较。你到底想做什么?