window.alert(1)

Run Settings
LanguageJavaScript
Language Version
Run Command
// 'somestring'.replace(/some/,function($1){ // //do something with some // console.log($1) // }) $ = []; //1 __ = !$+$; //2 "false" _ = -~-~-~[] //3 3 $_ = !''+$; //4 "true" $$ = $_[_/_]+$_[+$]; //5 "true"[3/3]+"true"[0] = "rt" $ = [$][ __[_] + //6 "false"[3] = "s" ({}+$)[_/_]+ //7 ({}+"")[3/3]=("[object Object]")[1] = "o" $$ //8 "rt" ]; //9 [[]]["sort"] = Array.prototype.sort //$(); //10 window.$ = this = window // console.log($) $()[__[_/_]+__[_+~$]+$_[_]+$$](_/_) //window["alert"](1) // [__[_/_]+__[_+~$]+$_[_]+$$] //"false"[1]+"false"[3+(-1)]+"true"[3] = ["a"+"l"+"e"+"rt"] = ["alert"]; /** * 来一行行看: 1. $先赋值为一个空数组 (后面会被覆盖) 2. __ = ![] + [] = false + [] = "false" 这里利用了javascript运算的强制类型转换特性。 首先空数组是一个非null值,因此![]的结果是false(布尔型)。在计算false + []时, 由于数组对象无法与其他值相加,在加法之前会先做一个toString的转换,空数组的toString就是"", 因此事实上在计算false + ""。这时false被自动转换为字符串。最终结果是"false"+"" = "false"。 **换句话说,在$为空数组时,使用 “+$”的方式可以将任何一个值转为字符串** 3. 在计算~[]时,~需要一个数字操作数,空数组无法直接转换为数字,则作为0处理。因此~[] = ~0 = -1。 因此: _ = -~-~-~[] = -~-~-(-1) = -~-~1 = -~-(-2) = -~2 = -(-3) = 3理论上,可以用这种方式得出1-9所有数字 4. !''是true,使用+$将其变为字符串 "true" 5. 这里需要注意的是,之前一直用“值+[]”来获得“值”的字符串形式。而“+[]”则是0(正号导致[]被自动转换为数值0) 。因此:$$ = "true"[3/3] + "true"[+[]] = "true"[1] + "true"[0] = "rt" 6. __[_] = "false"[3] = "s" 7. ({} + [])导致空对象{}被转换为字符串"[object Object]", 因此({}+$)[_/_] = "[object Object]"[1] = "o" 9. 这里把$覆盖为 [[]]["s"+"o"+"rt"]。注意这里[[]]本身是一个包含空数组的数组,其实对这一步来说, 任何一个数组都没有关系(不一定要是嵌套数组),但作者巧妙地把$的首次赋值式放在了数组内部,使代码更为紧凑。 最终结果是,$ = [[]]["sort"] = [[]].sort =Array.prototype.sort。 10. 调用$(),作为整个表达式最终的取值。需要注意,$是全局范围的,是window的一个属性,相当于window.$。 而Array.prototype.sort会返回this。对于window.$来说,this就是window。因此,整个第一部分的值,就是window本身! 当然,这个过程的正确运作依赖于当前浏览器的Array.prototype.sort实现能对this为window的情况容错。 */
Editor Settings
Theme
Key bindings
Full width
Lines