为什么{} == {}是错误的,但是{} + {} == {} + {}是真实的
为什么在node.js中{} == {}
相当于false
,但是{} + {} == {} + {}
相当于true
?
> {} == {} false
> {} + {} == {} + {} true
+
这里是string连接运算符。 这个:
{} == {}
意思是“如果我用{}
创build一个对象,另一个用{}
创build对象,它们是同一个对象吗? 答案是“否”。
这个:
{} + {} == {} + {}
意思是“原始string"[object Object][object Object]"
与原始string"[object Object][object Object]"
?”相同; 答案是“是”。
编辑添加:许多评论者指出,在Chrome的Web控制台中, {} + {}
执行数字加法, NaN + NaN
, {} + {} == {} + {}
实际上返回false
(因为它不是真的NaN == NaN
)。 Firefox的Web控制台的效果和Chrome相同,但是如果你在页面中运行它,它会得到与node.js相同的结果。
[编辑:关于规范如何规定{} + {}
应该是string连接和{} + {} == {} + {}
应该是真实的长解释; 解释,虽然正确,不再是非常有趣的,下面给出。]
编辑补充:感谢jJ'的评论,我现在可以提供一个更好的解释不一致。
Web控制台行为的原因是Web控制台并不特别需要expression式; 它会高兴地接受像if(true) { }
。 所以,当它看到{} + {}
,它不会将其解释为一个expression式; 初始{}
被解释为一个裸块,然后+ {}
被解释为一个expression式(创build一个新的对象,将其转换为一个原始数字 – 即NaN
– 并计算该数字)。 Web控制台显示最后一个expression式的结果(例如,input3; 4
将给出输出4
),在这种情况下是NaN
。
{} + {} == {} + {}
类似地被解释为“空块”,后跟(+{}) == ({} + {})
“,即”空块, NaN == '[object Object][object Object]'
“,即”空块,后面是false
“。
这可以通过使用括号来解决; ({} + {} == {} + {})
,例如,返回true
。
( eval('{} + {}')
是NaN
和eval('({} + {})')
(这种行为并不是完全特定于Web控制台, eval
遵循相同的规则,是'[object Object][object Object]'
。)