我最近看到一个来自某个来源的表达式,看起来像下面的内容 -
++[[]][+[]]+[+[]]
在Chrome(Windows 7,版本27.0.1453.94 m)控制台中输入此内容会显示"10"
的结果。
有人可以解释这里发生了什么吗?
答案 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(++[[]][+[]]+[+[]])
进行验证。