`1 + {}` 和 `{} + 1` 中的原始值转换是如何发生的?

How does primitive value conversion happen in `1 + {}` and `{} + 1`?

我是一名初级开发人员,我不明白为什么下面的语句会有这样的输出。有人可以解释一下 how/why 后面的两个表达式被 JavaScript 不同地插入,它们的输出是不同的。

1 + {} // => "1[object Object]"
{} + 1 // => 1

由于 + 是一个交换运算符,所以我期待相同的答案,但似乎我缺少一些语言规则。

在 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 以了解更多信息。