JavaScript:为什么[] +( - 〜{} - 〜{} - 〜{} - 〜{})+( - 〜{} - 〜{});返回" 42"

时间:2015-06-11 20:25:37

标签: javascript

在我的时事通讯中看到这一点。在Chrome和Firefox上测试过。我仍然无法弄明白。

[]+(-~{}-~{}-~{}-~{})+(-~{}-~{});    //=>  "42"

2 个答案:

答案 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'

对此进行验证