警报如何(++ [[]] [+ []] + [+ []]);计算为0? 这个过程叫什么,以便我可以详细了解这个警报如何(++ [[]] [+ []] + [+ []]);计算为0?
回答
表达式++[[]][+[]]+[+[]]
实际上会返回字符串'10'
。让我们来分析一下:
第1步:+[]
这是一个元加号操作后跟一个空数组常量。一元正尝试将后面的值转换为整数。在这种情况下的值是数组:
+[]; // 0
// This is identical:
Number([]); // 0
返回的值是等效于调用[].toString()
,然后给予该结果。 [].toString()
将返回一个空字符串(''
),并且Number('')
将返回0
。
数组对象覆盖对象的toString方法。对于Array对象,toString方法会加入数组并返回一个包含每个由逗号分隔的数组元素的字符串。
在非构造函数上下文中(即,没有
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'
@ Jeffrey Westerkamp是否有任何优先顺序,我的意思是一般情况下,不只是代码 –
如果你的意思是_我应该在任何情况下使用它我的项目_,答案肯定不是。这些片段应该被认为是帮助你理解JS怪癖的谜题。我的观点:永远不会在现实生活中使用这种“魔法”。 –
好的。谢谢 –
- 1. 如何在警报中创建计算?
- 2. Android:执行计算时弹出警报
- 3. 如果计算结果为负,则输出0,否则计算
- 4. 击+计算报警如果阈值是下最小
- 5. 如何让数学计算在0
- 6. iPhone的UIButton buttonType总是计算为0?
- 7. 如何在警报
- 8. 如何排除此计算中的任何值0 0
- 9. 如何计算rdlc报告中的计算文本框?
- 10. 如何通过取消旧警报和添加新警报来更新警报?
- 11. 如何计算Telerik报告中的组?
- 12. 计划重复报警
- 13. 计时器警报 - 修正
- 14. 报警系统设计
- 15. ActiveRecord:在计算中将nil视为0?
- 16. 如何使Excel“IF”公式计算空白单元格为“0”?
- 17. 如何计算0111为0 + 1 + 1 + 1 = 3在php中
- 18. 如何更改AlarmManager警报?
- 19. 如何触发警报
- 20. 如何清除报警管理器中的先前报警?
- 21. ics警报不报警
- 22. PHP:计算结束了0?
- 23. 如何规划警报声?
- 24. 当时间设置为0时即时调用警报
- 25. 阵列警报0 for .length不知道为什么
- 26. 有没有办法在表格视图中计算警报?
- 27. 我不能通过在按钮点击计算警报
- 28. 如何从报警管理器获取报警ID
- 29. SQL避免0在计算
- 30. 计算0%的利息?
你试图做什么?在jsfiddle中实际解释更多 – Bhargav
它是10! :0 @Bhargav ...我想这只是好奇...我想知道为什么JS在这里计算任何东西 – CodeHacker
请参阅[JSFUCK](https://en.wikipedia.org/wiki/JSFuck ) –