这个javascript代码如何/为什么打印'有趣'?

PhD*_*PhD 7 javascript

alert(
    (![]+[])[[]-[]]+
    (([]+[])+([][[]]))[[]-[]]+
    (([]+[])+([][[]]))[!![]-[]]
);
Run Code Online (Sandbox Code Playgroud)

继承人的小提琴:http://jsfiddle.net/leeny/6VugZ/

这段神秘的代码究竟是如何工作的?

Zet*_*eta 7

        vvvvvvv [0]
(![]+[])[[]-[]]                            = "false"[0]
^^^^^^^^ "false"

                  vvvvvvv again [0]
(([]+[])+([][[]]))[[]-[]]                  = "undefined"[0]
^^^^^^^^^^^^^^^^^^ "undefined"

                  vvvvvvvvv this time [1]
(([]+[])+([][[]]))[!![]-[]]                = "undefined"[1]
^^^^^^^^^^^^^^^^^^ again "undefined"
Run Code Online (Sandbox Code Playgroud)

因此,你得到"f"+"u"+"n" === "fun".

进一步说明

"false"

![]false.+[]只是作为一个字符串的转换.因此我们获得了字符串"false".

"undefined"

其中一个操作数需要是一个字符串.这是由[]+[].实际undefined是在右侧创建的:[][[]]=== [][0],空数组的第一个条目是undefined.