为什么{} == {}是错误的,但是{} + {} == {} + {}是真实的

为什么在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('{} + {}')NaNeval('({} + {})') (这种行为并不是完全特定于Web控制台, eval遵循相同的规则,是'[object Object][object Object]' 。)