以下表达式如何评估为“10”

时间:2013-05-31 06:27:21

标签: javascript expression

我最近看到一个来自某个来源的表达式,看起来像下面的内容 -

++[[]][+[]]+[+[]]

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

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

JSFiddle

3 个答案:

答案 0 :(得分:4)

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

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

接下来要注意的是++[[]][0]是应用于[[]]的第一个元素的preincrement运算符。通常,您无法将++应用于数组,但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。 (最后一个因为小数点分隔符是.,而不是,。我不知道如果我的语言环境不同会发生什么。)

答案 1 :(得分:2)

此表达式将有效的Javascript结构字符串化为NaN,数字,布尔undefined等。

e.g。

+[] -> 0  //The unary plus operator is applied to the result of toString applied to an empty array (which is an empty string)

!+[] -> true

您也可以查看this question, 并在no alnum cheat sheets

答案 2 :(得分:2)

+[]是从数组到数字的数字转换,为0。

+[0]也是0。

因此最终结果可以推导到(++0) + [0] 1+[0]

添加数组的数字。它们被转换为字符串,因此结果实际上是'10'。

您可以记录typeof(++[[]][+[]]+[+[]])进行验证。