Javascript 为什么{}=={}是假的,但是{}+;{}=={}+;{}是真的

Javascript 为什么{}=={}是假的,但是{}+;{}=={}+;{}是真的,javascript,node.js,Javascript,Node.js,为什么node.js中的{}=={}等同于false,而{}+{}={}+{}等同于true > {} == {} false +这是字符串连接运算符。这: {} == {} 表示“如果我使用{}创建了一个对象,并且使用{}创建了另一个对象,那么它们是同一个对象吗?”;答案是“不” 这: 表示“基本字符串”[对象对象][对象对象]”与基本字符串“[对象对象][对象对象]”?”相同;答案是“是的” 编辑添加:许多评论者指出,在Chrome的Web控制台中,{}+{}执行数字加法,NaN

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

> {} == {}
false

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

{} == {}
表示“如果我使用
{}
创建了一个对象,并且使用
{}
创建了另一个对象,那么它们是同一个对象吗?”;答案是“不”

这:

表示“基本字符串<代码>”[对象对象][对象对象]”与基本字符串<代码>“[对象对象][对象对象]”?”相同;答案是“是的”


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

[修订:详细解释了规范如何规定
{}+{}
应该是字符串连接,
{}+{}=={}+{}
应该是正确的;尽管解释是正确的,但考虑到下面的内容,它不再那么有趣。]


编辑添加:多亏了作者的评论,我现在可以更好地解释不一致性

Web控制台行为的原因是Web控制台并不特别需要表达式;它将愉快地接受类似于
if(true){}
的内容。因此,当它看到
{}+{}
时,它不会将其解释为表达式;初始的
{}
被解释为一个裸块,然后
+{}
被解释为一个表达式(创建一个新对象,将其转换为一个基本数字,即
NaN
,并计算为该数字)。Web控制台显示最后一个表达式的结果(例如,输入
3;4
将给出输出
4
),在本例中为
NaN

{}+{}={}+{}
类似地被解释为“空块,后跟
(++})=({}+{}
”,即“空块,后跟
NaN='[object object][object object]'
”,即“空块,后跟
false

这可以用括号固定<代码>({}+{}=={}+{}),例如,返回
true


(顺便说一句,这种行为并不是完全特定于Web控制台。
eval
遵循相同的规则,例如
eval({}+{}')
NaN
eval({}+{})
'[object object][object object]

相关的:在Chrome中它是false,只是出于兴趣。@RichBradshaw没有使用Chrome进行测试,只是使用了node。我认为这个问题的一个好答案应该是,为什么node的行为与Chrome等web浏览器中的控制台不同/ff@RichBradshaw当然是的,是的,我看到,{}+{}的结果是“[object object][object]”,我是node.js的新手,没有注意到它只是一个字符串,我以为它是节点的内部数据类型:),现在我看到
typeof({}+{})
string
。谢谢你的回答和回答explanation@ruakh:很好的解释!关于为什么chrome和firefox中的
{}+{}={}+{}
返回
false
有什么想法吗?@go-oleg因为在FF
{}+{}
中是
NaN
。而
NaN==NaN
为false,因为NaN永远不等于它自己。请参阅此说明:在chrome和FF控制台中,{}和({})是不同的东西,因为块和对象文字的模糊性。左侧的“{}+{}”类似于解析并忽略空块“{}”,然后尝试使用“+”将对象“{}”转换为数字,因为在运算符之后需要一个表达式。在右侧,它需要表达式,因此它连接两个{}.toString()。所以这里还有更多的“诡计:)。另一方面,Node使用不同的求值方式,因此它不会解释空块。请参阅为什么它在Node的REPL中以这种方式工作,而不是在Chrome中。
{} == {}
{} + {} == {} + {}