原始值转换如何在“1 + {}”和“{} + 1”中发生?

时间:2015-02-22 18:03:36

标签: javascript primitive

我是初学者,我无法理解为什么以下语句会有这样的输出。有人可以解释为什么/为什么跟随两个表达式被JavaScript互相渗透,它们的输出是不同的。

1 + {} // => "1[object Object]"
{} + 1 // => 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以了解详情。