在我的时事通讯中看到这一点。在Chrome和Firefox上测试过。我仍然无法弄明白。
[]+(-~{}-~{}-~{}-~{})+(-~{}-~{}); //=> "42"
答案 0 :(得分:6)
评价:
~{}
使用内部函数进行评估:
~ToInt32({})
给出了-1。
参考ECMA规范 - http://www.ecma-international.org/ecma-262/5.1/#sec-9.5 这个解释 - http://jibbering.com/faq/notes/type-conversion/#tcToInt32
因此,在这种情况下
(-~{}-~{}) == 2
(-~{}-~{}-~{}-~{}) == 4
正如你在表达式的开头有[]+
一样,javascript使用加上像string这样的操作数。所以你有"" + "4" + "2" = "42"
答案 1 :(得分:3)
~
运算符是Bitwise NOT运算符。它返回一个数字的“1的补码”。因为{}
被转换为数字,导致NaN
。 +{} == NaN
也会发生同样的情况。按位而不是~NaN == -1
。所以:
(-~{}-~{}-~{}-~{}) == 4
& (-~{}-~{}) == 2
空数组的DefaultValue是一个空字符串。例如[]==[]+[] && []+[]==''
从那以后,完整的解析是:
[]+ /*converted to ''+*/ (-~{}-~{}-~{}-~{}) /*Equals numeric 4, but concatenated as a string to become '4'*/ + (-~{}-~{}) /*Equals numeric 2, but concatenated as a string to become '2'*/
,最终结果实际为'42'
。
您可以通过typeof([]+(-~{}-~{}-~{}-~{})+(-~{}-~{})) === 'string'