7

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

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

将其输入 Chrome(Windows 7,版本 27.0.1453.94 m)控制台会显示"10".

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

JSF中。

4

3 回答 3

4

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'which 评估为NaN。(最后一个因为小数点分隔符是.,而不是,。我不知道如果我的语言环境不同会发生什么。)

于 2013-05-31T06:52:13.007 回答
2

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

也是+[0]0。

所以可以推导出最终的结果(++0) + [0]1+[0]

并为一个数字添加一个数组。它们被转换为字符串,因此结果实际上是“10”。

您可以登录typeof(++[[]][+[]]+[+[]])验证。

于 2013-05-31T06:51:17.950 回答
2

此表达式将有效的 Javascript 构造字符串化,这些构造会产生 yelds NaN、 numbers、 booleanundefined等。

例如

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

!+[] -> true

你也可以看看这个问题,看看no alnum 备忘单

于 2013-05-31T06:44:24.247 回答