Why in node.js is {} == {}
equivalent to false
, but is {} + {} == {} + {}
equivalent to true
?
> {} == {}
false
> {} + {} == {} + {}
true
Why in node.js is {} == {}
equivalent to false
, but is {} + {} == {} + {}
equivalent to true
?
> {} == {}
false
> {} + {} == {} + {}
true
+
这是字符串连接运算符。这个:
{} == {}
意思是“如果我用 来创建一个对象,用 来创建{}
另一个对象{}
,它们是同一个对象吗?”;答案是“不”。
这个:
{} + {} == {} + {}
表示“原始字符串是否与原始字符串"[object Object][object Object]"
相同"[object Object][object Object]"
?”;答案是“是”。
编辑添加:许多评论者指出,在 Chrome 的 Web 控制台中,{} + {}
执行数字加法,NaN + NaN
,这样{} + {} == {} + {}
实际上会返回false
(因为它不是真的NaN == NaN
)。Firefox 的 Web 控制台提供与 Chrome 相同的结果,但如果您在页面内运行它,它会提供与 node.js 相同的结果。
[已编辑:详细说明规范如何规定{} + {}
应该是字符串连接并且{} + {} == {} + {}
应该是真的;鉴于以下情况,解释虽然正确,但不再非常有趣。]
编辑添加:感谢jJ'的评论,我现在可以更好地解释不一致之处。
Web 控制台行为的原因是 Web 控制台不特别需要表达式;它会很高兴地接受类似的东西if(true) { }
。因此,当它看到 时{} + {}
,它不会将其解释为表达式;initial{}
被解释为一个裸块,然后 the+ {}
被解释为一个表达式(创建一个新对象,将其转换为原始数字 - 即NaN
- 并评估为该数字)。Web 控制台显示最后一个表达式的结果(例如,输入3; 4
将给出输出4
),在本例中为NaN
。
{} + {} == {} + {}
,类似地,被解释为“空块,后接(+{}) == ({} + {})
”,即“空块,后接NaN == '[object Object][object Object]'
”,即“空块,后接false
”。
这可以通过使用括号来解决;({} + {} == {} + {})
,例如,返回true
。
(顺便说一下,这种行为并不完全特定于 Web 控制台。eval
遵循相同的规则,例如eval('{} + {}')
isNaN
和eval('({} + {})')
is '[object Object][object Object]'
。)