如何以下表达式的一块计算结果为“10”
我最近看到的一个来源,它看起来像下面的表达式 -如何以下表达式的一块计算结果为“10”
++[[]][+[]]+[+[]]
输入该到Chrome浏览器(Windows 7的版本27.0。 1453.94米)控制台显示"10"
的结果。
有人可以解释这里发生了什么?
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
。 (最后因为小数点分隔符是.
,而不是,
。我不知道如果我的语言环境不同,会发生什么。)
此表达式stringifies有效的Javascript构造一个yelds NaN
,数字,布尔undefined
等
例如
+[] -> 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。
我想出了那部分。我把表达式减少到'++ [[]] [0] + [0]',但是不知道'1'是怎么来的...... –
好吧,我看到了欺骗表已经列出'++ [[]] [+ []]'等效于'1',但没有给出任何解释........ –
+[]
是从阵列中的数转换成数,其值为0。
和+[0]
也是0
所以最终的结果可以推断出,以(++0) + [0]
这是1+[0]
。
并为一个数字添加一个数组。它们被转换成字符串,所以结果实际上是'10'。
您可以登录typeof(++[[]][+[]]+[+[]])
进行验证。
我非常想到这一点。只是想知道如何将'[[]] [0]'转换为'0'部分。在这个过程中遵循哪种转换规则? –
@SayemAhmed - 当'++'不能应用于数组时,它可以应用于数组元素。 '[[]]'的第一个元素是'[]';试图应用'++'来触发JS将'[]'转换为0(就像它使用'+ []'所做的那样)。 –
好的,我明白你的观点。我只是发现++运算符的行为有点难以理解。我不能将它应用到数组,我得到。但是当你将它应用到一个数组元素,并且如果这个元素本身就是一个数组,那么它会被转换为一个基元? ECMA规范是否在某处列出了这种行为? –