一个复杂很有意思的javascript代码的解析

标签:javascript

zhunqun 的微博发现了一段有意思的代码:

($=[$=[]][(__=!$+$)[_=-~-~-~$]+({}+$)[_/_]+ ($$=($_=!''+$)[_/_]+$_[+$])])()[__[_/_]+__ [_+~$]+$_[_]+$$](_/_);

详细代码解析:

(
$=[$=[]]  // $ = []
    [
        (__= !$ + $)  // __ = "false"
            [_=-~-~-~$] // _ = 3 
                                    // (__)[3] = "s"
                +
   
        ({} + $)  // ({} + $) = [object Object]
            [_/_]  // _/_ = 1
                +   // ([object Object])[1] = "o"
           
        ($$ =   //
                ($_=!'' + $) // !''+ $ = "true"  ;  $_ = "true"
                        [_/_]  // _/_ = 1; 
                                    // $_[1] = "r"
                    + 

                $_[+$] // +$ = 0;  $_[0] = "t"
        )  // $$= "rt"
    ]  // ["sort"]
     // []["sort"] = [].sort = function sort() { [native code] }
     // $ = []["sort"]
)() // ($)() = [object Window]

[
    __[_/_]  // __ = "false"; 
                    // __[1] = "a"
        +

    __ [_+~$] //_ = 3;  ~$ = -1;  _ + ~$ = 2
                        // __[2] = "l"
        +

    $_[_] // $_ = "true" ; _ = 3;
                // $_[3] = "e"
        +
   
     $$  // $$ = "rt"

](_/_); // _ / _ = 1

// window["alert"](1)

 

 这里需要注意的几点:

1. javascript 里面 $, _ 均可以作为变量名

2. 函数还可以这样调用: 比如  [1,2,4,1,9,1].sort()  可以写成 [1,2,4,1,9,1]["sort"]();

3. ~ 对数字按位取反

4.  javascript 中在对不同类型的变量 使用 + 时候的规则

5.  最后一个针对某些native code写的方法,执行会返回 window对象, 比如

var s = [].sort ; t=s();  则  t 是 window

 

 

呵呵, 发现 zhunqun 也写了详细的解释,参考: http://www.zhuoqun.net/html/y2011/1624.html

This article is posted by on , link is .

Leave a reply