我知道这是一个玩笑,但有人发布了它并在浏览器中显示“失败”,发生了什么导致这种情况?
alert((![]+[])[+[]]+(![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]);
alert((![]+[])[+[]]+(![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]);
这里有一篇关于这个主题的好博客文章:http://patriciopalladino.com/blog/2012/08/09/non-alphanumeric-javascript.html
你基本上创建字符串("false","undefined"等),然后再使用true的相加来获取索引。
例如,第一个字母(f):
(![]+[])[+[]]
你使用![]
来获取false,并添加[]
将其转换为字符串。括号内的内容现在是"false"。然后像访问数组一样访问它,´+[]`将其转换为0(false作为数字)。
true
的添加基本上让我大吃一惊。我一直在想这种索引是如何工作的... +1 - asimes
(![]+[])
会得到一个字符串——“false”,然后被索引为“false”[+[]] -> “false”[0] -> “f”,以此类推。 - user2864740([]+[][[]])
的结果是字符串undefined
。这两个字符串提供了所有你需要的内容,以适当的索引获取f
、a
、i
和l
。 - Barmar