2017-09-15 76 views
0

警报如何(++ [[]] [+ []] + [+ []]);计算为0? 这个过程叫什么,以便我可以详细了解这个警报如何(++ [[]] [+ []] + [+ []]);计算为0?

+0

你试图做什么?在jsfiddle中实际解释更多 – Bhargav

+0

它是10! :0 @Bhargav ...我想这只是好奇...我想知道为什么JS在这里计算任何东西 – CodeHacker

+3

请参阅[JSFUCK](https://en.wikipedia.org/wiki/JSFuck ) –

回答

4

表达式++[[]][+[]]+[+[]]实际上会返回字符串'10'。让我们来分析一下:

第1步:+[]

这是一个元加号操作后跟一个空数组常量。一元正尝试将后面的值转换为整数。在这种情况下的值是数组:

+[]; // 0 

// This is identical: 
Number([]); // 0 

返回的值是等效于调用[].toString(),然后给予该结果​​。 [].toString()将返回一个空字符串(''),并且Number('')将返回0

Array.prototype.toString

数组对象覆盖对象的toString方法。对于Array对象,toString方法会加入数组并返回一个包含每个由逗号分隔的数组元素的字符串。

Number

在非构造函数上下文中(即,没有new运算符),可以使用Number执行类型转换。

所以,当我们在源改变+[] OCCURENCES到0,我们得到:

++[[]][0] + [0] 

步骤2:[[]][0]

该步骤是一个简单的阵列成员访问操作:首先定义一个嵌套有一个(空)数组的数组,然后用[0]访问第一个嵌套数组,该数组只返回[]。所以,如果我们更换表达的这一部分,我们得到:

++[] + [0] 

第3步:++[]

++ <value>操作第一尝试<value>转换成一个数字,然后递增数为1.在此示例中,将数组转换为数字的过程与+[]在步骤1中的方式相同:[]首先转换为字符串(在这种情况下为'',因为数组为空),然后转换为一个数字,这再次回顾rns 0。最后,0增加1,返回1。因此,如果我们更换表达的这一部分,我们得到:

1 + [0] 

第4步:1 + [0]

这是故事的怪异的一部分。根据上面的信息,您可能会认为这将评估为整数1,但实际上它将评估为字符串'10'。这是因为上述示例中数组类型转换的两个步骤(首先是字符串,然后是数字)。这两个步骤是必需的,因为数组总是操作数(即数学计算)。然而,运营商+可以作为算术+运营商或字符串连接运营商,而后者总是优先。

因此,一旦[0]被转换为字符串,给予+操作两个操作数将被转换为字符串,因为一个操作数是已经的字符串。如果我们现在用转换的操作数替换表达式,我们得到评估表达式的最后一步:

'1' + '0'; // '10' 
+0

@ Jeffrey Westerkamp是否有任何优先顺序,我的意思是一般情况下,不只是代码 –

+0

如果你的意思是_我应该在任何情况下使用它我的项目_,答案肯定不是。这些片段应该被认为是帮助你理解JS怪癖的谜题。我的观点:永远不会在现实生活中使用这种“魔法”。 –

+0

好的。谢谢 –