我不确定这一行javascript发生了什么:
alert( (''+[][[]])[!+[]+!+[]] ); // shows "d"
我发现了什么:
var a = ! + []; // == true
var b = ! + [] + ! + []; // == 2
似乎第二部分是对字母数组或某种形式的引用,但我不明白这是怎么来的
(''+[][[]])
也:
alert( (''+[][])[2] ); // nothing happens; console says "unexpected token ]"
alert( (''+[[]][])[2] ); // nothing happens; console says "unexpected token ]"
alert( (''+[[]][[]])[2] ); // shows "d"
alert( (""+true)[2] ); // shows "u"
我会为你分解它:
('' + [][[]])[!+[]+!+[]]
= ('' + undefined)[!+[]+!+[]] // [][[]] grabs the []th index of an empty array.
= 'undefined'[! + [] + ! + []]
= 'undefined'[(! + []) + (! + [])]
= 'undefined'[true + true]
= 'undefined'[2]
= 'd'
这里解释! + [] == true
一元正减运算符的重要用途是什么?
因为"" + true
是字符串"true"
,而第三个字符(索引2)是u
。
像! + []
这样的事情是有效的,因为+
也可以是一元运算符,请参阅此 SO 问题。
alert( (""+true)[2] ); // shows "u"
它返回字符串"true"的第 3 个字母。
这会带来什么回报?
alert( (''+[[]][[]]));