为什么这段无意义的JavaScript代码会弹出“fail”?

3
我知道这是一个玩笑,但有人发布了它并在浏览器中显示“失败”,发生了什么导致这种情况?
alert((![]+[])[+[]]+(![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]);

有人在Facebook上发布了它,否则我不知道它来自哪里。 - asimes
无论如何,这个问题的主要“技巧”在于(![]+[])会得到一个字符串——“false”,然后被索引为“false”[+[]] -> “false”[0] -> “f”,以此类推。 - user2864740
2
([]+[][[]]) 的结果是字符串 undefined。这两个字符串提供了所有你需要的内容,以适当的索引获取 fail - Barmar
1
我必须说,从严肃的角度来看,我发现它非常有趣,可以让你深入了解编程的可能性。 - myfunkyside
我认为这不是一个严肃的问题,但我没有意识到它之前已经被回答过了(感谢user2864740),因为重复关闭。 - asimes
“是什么导致了这种情况发生”类型转换 ;) - Felix Kling
1个回答

1

这里有一篇关于这个主题的好博客文章:http://patriciopalladino.com/blog/2012/08/09/non-alphanumeric-javascript.html

你基本上创建字符串("false","undefined"等),然后再使用true的相加来获取索引。

例如,第一个字母(f): (![]+[])[+[]] 你使用![]来获取false,并添加[]将其转换为字符串。括号内的内容现在是"false"。然后像访问数组一样访问它,´+[]`将其转换为0(false作为数字)。


哇,true 的添加基本上让我大吃一惊。我一直在想这种索引是如何工作的... +1 - asimes
@asimes 是的,这是一种非常有趣的编写代码的方式,但没人能理解。如果你还没有阅读整篇文章,我建议你读完它。 - orhanhenrik
正在进行中,谢谢。 - asimes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接