关于javascript:why({} + {})=“[object Object] [object Object]”?

why ({}+{})=“[object Object][object Object]”?

本问题已经有最佳答案,请猛点这里访问。

我已经测试了代码:

1
2
{}+{} = NaN;
({}+{}) ="[object Object][object Object]";

为什么添加()会改变结果?


{}+{}是一个块,后跟一个表达式。第一个{}是块(就像您附加到if语句的类型),+{}是表达式。第一个{}是一个块,因为当解析器查找语句并看到{时,它将其解释为一个块的打开。那块空的,什么也不做。在处理完该块之后,解析器将看到+,并将其作为一元+读取。这会将解析器转换为处理表达式。在表达式中,{启动对象初始值设定项而不是块,因此{}是对象初始值设定项。对象初始值设定项创建一个对象,然后+试图强制转换为一个数字,得到NaN

({}+{})中,打开的(将解析器转换为期望表达式而不是语句的模式。因此,()包含两个对象初始值设定项,它们之间有一个二进制+(例如,"加法"运算符,可以是算术或字符串连接)。二元+运算符将根据其操作数尝试添加或连接。它将其操作数强制为原语,在{}的情况下,它们都成为字符串"[object Object]"。所以你最终得到了"[object Object][object Object]",连接它们的结果。


因为模棱两可。{}是一个对象,也是一个块边界。如果没有(),则解释为后者。