<分区>
我最近从一个来源看到一个表达式,看起来像下面这样 -
++[[]][+[]]+[+[]]
将此输入到 Chrome(Windows 7,版本 27.0.1453.94 m)控制台会显示 “10”
的结果。
谁能解释一下这里发生了什么?
JSFiddle .
<分区>
我最近从一个来源看到一个表达式,看起来像下面这样 -
++[[]][+[]]+[+[]]
将此输入到 Chrome(Windows 7,版本 27.0.1453.94 m)控制台会显示 “10”
的结果。
谁能解释一下这里发生了什么?
JSFiddle .
最佳答案
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'
,后者的计算结果为 NaN
。 (最后一个是因为小数点分隔符是.
,不是,
。我不知道如果我的语言环境不同会发生什么。)
关于javascript - 以下表达式如何计算为 "10",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16850994/