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