如何以下表达式的一块计算结果为“10”

问题描述:

我最近看到的一个来源,它看起来像下面的表达式 -如何以下表达式的一块计算结果为“10”

++[[]][+[]]+[+[]] 

输入该到Chrome浏览器(Windows 7的版本27.0。 1453.94米)控制台显示"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。 (最后因为小数点分隔符是.,而不是,。我不知道如果我的语言环境不同,会发生什么。)

+0

我非常想到这一点。只是想知道如何将'[[]] [0]'转换为'0'部分。在这个过程中遵循哪种转换规则? –

+1

@SayemAhmed - 当'++'不能应用于数组时,它可以应用于数组元素。 '[[]]'的第一个元素是'[]';试图应用'++'来触发JS将'[]'转换为0(就像它使用'+ []'所做的那样)。 –

+0

好的,我明白你的观点。我只是发现++运算符的行为有点难以理解。我不能将它应用到数组,我得到。但是当你将它应用到一个数组元素,并且如果这个元素本身就是一个数组,那么它会被转换为一个基元? ECMA规范是否在某处列出了这种行为? –

此表达式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] + [0]',但是不知道'1'是怎么来的...... –

+0

好吧,我看到了欺骗表已经列出'++ [[]] [+ []]'等效于'1',但没有给出任何解释........ –

+[]是从阵列中的数转换成数,其值为0。

+[0]也是0

所以最终的结果可以推断出,以(++0) + [0]这是1+[0]

并为一个数字添加一个数组。它们被转换成字符串,所以结果实际上是'10'。

您可以登录typeof(++[[]][+[]]+[+[]])进行验证。