`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 以了解更多信息。
我是一名初级开发人员,我不明白为什么下面的语句会有这样的输出。有人可以解释一下 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 以了解更多信息。