我是初学者,我无法理解为什么以下语句会有这样的输出。有人可以解释为什么/为什么跟随两个表达式被JavaScript互相渗透,它们的输出是不同的。
1 + {} // => "1[object Object]"
{} + 1 // => 1
由于+
是一个可交换的运算符,所以我期待相同的答案,但似乎我缺少一些语言规则。
答案 0 :(得分:2)
在JavaScript中,加法运算符(+)将一个数值表达式的值添加到另一个,或者连接两个字符串。
两个表达式的类型决定了+运算符的行为。
如果两个表达式都是数字或布尔值,则会添加它们。
1 + 1;
// 2
true + false;
// 1
true + true;
// 2
如果两个表达式都是字符串,则将它们连接起来:
"hel" + "lo";
// "hello"
如果一个表达式是数字而另一个表达式是字符串,则它们也会连接在一起:
1 + {}
// "1[object Object]"
此处[object Object]
是{}
的字符串表示形式:
String({})
// "[object Object]"
所以希望第一个例子很明确。
但是,如果+
的第一个操作数是空对象文字,事情会变得奇怪。 JavaScript将此解释为空代码块并忽略它。
因此,{} + 1
只是被解释为+1
,显然是1。
那么,为什么第一个{}
被解释为代码块?因为完整的输入被解析为语句,并且语句开头的花括号被解释为启动代码块。
您可以通过强制将输入解析为表达式来解决此问题,然后为您提供预期的输出:
({} + 1)
// "[object Object]1"
您可能需要阅读this great post以了解详情。