为什么{} == {}为false,但{} + {} == {} + {}为真

时间:2013-07-21 17:19:48

标签: javascript node.js

为什么node.js的{} == {}等同于false,但{} + {} == {} + {}等同于true

> {} == {}
false
> {} + {} == {} + {}
true

1 个答案:

答案 0 :(得分:53)

+这里是字符串连接运算符。这样:

{} == {}

表示"如果我用{}创建一个对象,另一个用{}创建对象,它们是同一个对象吗?&#34 ;;答案是" no"。

此:

{} + {} == {} + {}

表示"是原始字符串"[object Object][object Object]"与原始字符串"[object Object][object Object]"相同?&#34 ;;答案是"是"。


已编辑添加:许多评论者指出,在Chrome的网络控制台中,{} + {}会执行数字添加NaN + NaN,以便{{1}实际上返回{} + {} == {} + {}(因为它不是false)。 Firefox的Web控制台提供与Chrome相同的结果,但是如果您在页面内运行它,它会提供与node.js相同的结果。

[已编辑:详细说明规范如何规定NaN == NaN 应该字符串连接,而{} + {} 应该为真;如果正确的话,解释不再是非常有趣的,如下所示。]


编辑添加:感谢jJ'的评论,我现在可以更好地解释这种不一致。

Web控制台行为的原因是Web控制台并不特别需要表达式;它会很乐意接受像{} + {} == {} + {}这样的东西。因此,当它看到if(true) { }时,它并不将其解释为表达式;初始{} + {}被解释为裸块,然后{}被解释为表达式(创建一个新对象,将其转换为原始数字 - 即+ {} - 并评估为数)。 Web控制台显示最后一个表达式的结果(例如,输入NaN将给出输出3; 4),在这种情况下为4

类似地,

NaN被解释为"空块,然后是{} + {} == {} + {}",即"空块,然后是(+{}) == ({} + {})& #34;,即"空块,然后是NaN == '[object Object][object Object]'"。

这可以通过使用括号来解决;例如,false会返回({} + {} == {} + {})

(顺便说一下,此行为并非完全针对Web控制台。true遵循相同的规则,因此evaleval('{} + {}')NaNeval('({} + {})')。)