以下表达式如何评估为"10"

MD *_*med 7 javascript expression

我最近看到一个来自某个来源的表达式,看起来如下所示 -

++[[]][+[]]+[+[]]
Run Code Online (Sandbox Code Playgroud)

在Chrome(Windows 7,版本27.0.1453.94 m)控制台中输入此内容即可显示结果"10".

有人能解释一下这里发生了什么吗?

JSFiddle.

Ted*_*opp 4

JavaScript 在数据类型之间的转换方面相当灵活。首先要注意的是+[]计算结果为 0。*这让我们可以将表达式重写为:

++[[]][0] + [0]
Run Code Online (Sandbox Code Playgroud)

接下来要注意的是++[[]][0]应用于 的第一个元素的预自增运算符[[]]。通常,您不能应用于++数组,但 JavaScript 会善意地将第一个元素转换为0,因此结果是++[[]][0]1第一个元素[[]]现已递增)。它有点像这样:

var a = [[]];
var b = ++a[0];
// now a will be [1] and b will be 1
Run Code Online (Sandbox Code Playgroud)

这给我们留下了:

1 + [0]
Run Code Online (Sandbox Code Playgroud)

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

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