我测试了代码:
{}+{} = NaN;
({}+{}) = "[object Object][object Object]";
为什么添加()
会更改结果?
答案 0 :(得分:8)
{}+{}
是一个块,后跟一个表达式。第一个{}
是块(就像您附加到if
语句的那种),+{}
是表达式。第一个{}
是一个块,因为当解析器查找语句并看到{
时,它会将其解释为块的开头。那块空了,什么也没做。处理完块后,解析器会看到+
并将其读作一元+
。这将解析器转移到处理表达式。在表达式中,{
启动对象初始值设定项而不是块,因此{}
是对象初始值设定项。对象初始值设定项创建一个对象,+
然后尝试强制转换为数字,获取NaN
。
在({}+{})
中,开头(
将解析器转换为期望表达式的模式,而不是语句。因此()
包含带有二进制 +
的两个对象初始值设定项(例如,“加法”运算符,可以是算术或字符串连接)它们之间。二进制+
运算符将尝试根据其操作数添加或连接。它将其操作数强制转换为基元,在{}
的情况下,它们每个都成为字符串"[object Object]"
。所以你最终会得到"[object Object][object Object]"
,这是连接它们的结果。
答案 1 :(得分:1)
由于含糊不清。 {}
是一个对象,但也是一个块边界。没有()
,它被解释为后者。