我最近从某个来源看到了一个表达式,如下所示 -
++[[]][+[]]+[+[]]
将其输入 Chrome(Windows 7,版本 27.0.1453.94 m)控制台会显示"10".
有人可以解释这里发生了什么吗?
JSF中。
我最近从某个来源看到了一个表达式,如下所示 -
++[[]][+[]]+[+[]]
将其输入 Chrome(Windows 7,版本 27.0.1453.94 m)控制台会显示"10".
有人可以解释这里发生了什么吗?
JSF中。
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。(最后一个因为小数点分隔符是.,而不是,。我不知道如果我的语言环境不同会发生什么。)
+[]是从数组到数字的数字转换,即 0。
也是+[0]0。
所以可以推导出最终的结果(++0) + [0]是1+[0]。
并为一个数字添加一个数组。它们被转换为字符串,因此结果实际上是“10”。
您可以登录typeof(++[[]][+[]]+[+[]])验证。
此表达式将有效的 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 备忘单。