This question already has answers here:
Why does ++[[]][+[]]+[+[]] return the string “10”?

(9个答案)


3年前关闭。




我最近从某个来源看到了一个表达式,如下所示-
++[[]][+[]]+[+[]]

将其输入Chrome浏览器(Windows 7,版本27.0.1453.94 m)会显示"10"的结果。

有人可以解释这里发生了什么吗?

JSFiddle

最佳答案

JavaScript在数据类型之间进行转换非常灵活。首先要注意的是+[]的值为0。*这使我们将表达式重写为:

++[[]][0] + [0]

接下来要注意的是,++[[]][0]是应用于[[]]的第一个元素的预增量运算符。通常,您不能将++应用于数组,但JavaScript会将第一个元素转换为0,因此结果是++[[]][0]的计算结果为1(现在[[]]的第一个元素已增加)。有点像这样:
var a = [[]];
var b = ++a[0];
// now a will be [1] and b will be 1

这给我们留下了:
1 + [0]

JavaScript现在将int和数组转换为字符串(因为[0]不是数字值)并将它们连接在一起。做完了!

*我对+[]如何变成0的理解是,这是一个两步过程:首先,将[]转换为字符串基元,即空字符串。然后,空字符串将转换为数字,该数字为零。通过相同的路线,[1]评估为'1',然后评估为1[2]评估为2,等等。但是,[1, 2]评估为'1,2',其评估为NaN。 (最后一个原因是小数点分隔符是.,而不是,。我不知道如果我的区域设置不同会发生什么。)

08-19 10:05