一个复杂很有意思的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