我最近从某个来源看到了一个表达式,如下所示 -
++[[]][+[]]+[+[]]
将其输入 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 备忘单。