我已经测试了代码:
{}+{} = NaN;
({}+{}) = "[object Object][object Object]";
为什么添加()
更改会导致结果?
{}+{}
是一个后跟表达式的块。第一个{}
是块(就像您附加到if
语句的类型),+{}
是表达式。第一个{}
是一个块,因为当解析器正在寻找一条语句并看到时{
,它将解释它为一个块的开头。该块为空,什么也没做。处理完该块后,解析器将看到+
并将其读取为一元+
。这将解析器转变为处理表达式。在表达式中,a{
启动对象初始化器而不是块,因此a{}
是对象初始化器。对象初始化程序创建一个对象,+
然后尝试强制转换为数字get NaN
。
在中({}+{})
,开头(
将解析器转换为期望表达式而不是语句的模式。因此,它们()
包含两个对象初始化器,它们之间具有二进制 +
(例如,“加法”运算符,可以是算术运算或字符串连接)。二进制+
运算符将尝试根据其操作数进行添加或连接。它将其操作数强制转换为基元,在这种情况下{}
,它们各自成为字符串"[object Object]"
。因此,最终得到"[object Object][object Object]"
,将它们串联在一起的结果。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句