对象和数组的添加

24

有人能解释一下以下代码的运行结果是如何评估的吗?

{} + {} // NaN
[] + {} // "[object Object]"
{} + [] // 0
[] + [] // ""

1
我认为 {} + [] 实际上是 "0"(一个字符串),而不是 0(一个数字)。 - DaoWen
2
@DaoWen,实际上是一个整数0 - Adi
1
不,它是一个整数,如果您愿意,请在Chrome控制台中进行测试。 - Hilmi
4个回答

20

这里有一个详细的解释,请查看

请注意,在控制台直接执行 { } + { } 会得到 NaN,因为 { } 被认为是一个代码块而不是一个对象。

({}+{}) 应该是 '[object Object][object Object]'

真正的结果是:

console.log({}+{}) // '[object Object][object Object]'
console.log([]+{}) // '[object Object]'
console.log({}+[]) // '[object Object]'
console.log([]+[]) // ''

这个“它是块而不是对象”的问题真的很棒!谢谢! - Adi
另一个描述链接:https://loomcom.com/blog/2015/06/29/the-wats-of-javascript/ - Arda

3

{}+{} 中的第一个 {} 被解释为一个块,第二个 {} 被解释为空对象,加号 + 被解释为 一元加操作符,因此 {}+{} 等价于:

{
    //Empty block, does nothing
}

+{}    //Unary + applied to empty object, which is NaN

同样地,在 {}+[] 中,{} 被解释为一个语句块,而 +[] 被解释为应用于空数组的一元加法运算符,得到的结果是 0
对于 []+{}+ 被解释为字符串连接操作符,所以两个操作数都被转换为字符串,这种情况下 [] 被转换为空字符串(""),{} 被转换为 "[object Object]",然后两者被连接在一起得到 ""+"[object Object]",即 "[object Object]"
同样地,对于 []+[],两个数组都被转换为空字符串,得到的结果是 ""+"",即 ""

3

当使用任何对象和它的字符串表示形式添加数组时,结果总是一个连接。

例如:

[1] + [2] // is merged to "12", so [] + [] is an empty string ""

你的第二个例子同样适用。
['test'] + {} // "test[object Object]"

所以一个空数组加一个空对象只会返回一个[object Object]
对于向空对象添加内容也很容易:
计算一个简单的空对象:{},结果是未定义的。
两个undefined值相加会得到NaN,因为你无法对它们进行任何加法运算。 注意:返回值取决于JavaScript的实现(即在哪个浏览器或环境中)。
另外,JavaScript中的{} + {}是什么?

0
{} + {} 

你不能在两个对象上进行加法或任何操作

[] + {} // "[object Object]"

这只是一个字符串和对象之间的连接,你可以通过 alert({}); 得到相同的结果。

{} + [] // 0

相同

[] + [] // ""

两个空字符串的连接结果是空字符串。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接