javascript - 你能解释一下这个非字母数字 JS 代码是如何工作的吗?

标签 javascript

<分区>

我在网上找到了一个javascript代码(叫做NoAlphanumeric JS):

_=[]|[];$=_++;__=(_<<_);___=(_<<_)+_;____=__+__;_____=__+___;$$=({}+"")[_____]+({}+"")[_]+({}[$]+"")[_]+(($!=$)+"")[___]+(($==$)+"")[$]+(($==$)+"")[_]+(($==$)+"")[__]+({}+"")[_____]+(($==$)+"")[$]+({}+"")[_]+(($==$)+"")[_];$$$=(($!=$)+"")[_]+(($!=$)+"")[__]+(($==$)+"")[___]+(($==$)+"")[_]+(($==$)+"")[$];$_$=({}+"")[_____]+({}+"")[_]+({}+"")[_]+(($!=$)+"")[__]+({}+"")[__+_____]+({}+"")[_____]+({}+"")[_]+({}[$]+"")[__]+(($==$)+"")[___]; ($)[$$][$$]($$$+"('"+$_$+"')")() 

此代码将打开一个“警报”并打印“酷代码”...

谁能解释一下这段代码是如何工作的?

最佳答案

开始了!

添加换行符

...和一些评论

// Variable declarations
_=[]|[];
$=_++;
__=(_<<_);
___=(_<<_)+_;
____=__+__;
_____=__+___;

// Variable declarations that "do stuff"
$$=({}+"")[_____]+({}+"")[_]+({}[$]+"")[_]+(($!=$)+"")[___]+(($==$)+"")[$]+(($==$)+"")[_]+(($==$)+"")[__]+({}+"")[_____]+(($==$)+"")[$]+({}+"")[_]+(($==$)+"")[_];
$$$=(($!=$)+"")[_]+(($!=$)+"")[__]+(($==$)+"")[___]+(($==$)+"")[_]+(($==$)+"")[$];
$_$=({}+"")[_____]+({}+"")[_]+({}+"")[_]+(($!=$)+"")[__]+({}+"")[__+_____]+({}+"")[_____]+({}+"")[_]+({}[$]+"")[__]+(($==$)+"")[___];

// Final function call
($)[$$][$$]($$$+"('"+$_$+"')")()

扩展声明 1

// Variable declarations
// _=[]|[];  ->  replace `_` with 0
$=0;          //  (actually, 1)
__=(1<<1);    // 2
___=(1<<1)+1; // 3
____=2+2;     // 4
_____=2+3;    // 5

// Variable declarations that "do stuff"
$$=({}+"")[_____]+({}+"")[1]+({}[0]+"")[1]+((0!=0)+"")[___]+((0==0)+"")[0]+((0==0)+"")[1]+((0==0)+"")[__]+({}+"")[_____]+((0==0)+"")[0]+({}+"")[1]+((0==0)+"")[1];
$$$=((0!=0)+"")[1]+((0!=0)+"")[__]+((0==0)+"")[___]+((0==0)+"")[1]+((0==0)+"")[0];
$_$=({}+"")[_____]+({}+"")[1]+({}+"")[1]+((0!=0)+"")[__]+({}+"")[__+_____]+({}+"")[_____]+({}+"")[1]+({}[0]+"")[__]+((0==0)+"")[___];

// Final function call
(0)[$$][$$]($$$+"('"+$_$+"')")() 

扩展声明 2

变量的更多扩展,让我们评估那些 0==00!=0s。

// Variable declarations that "do stuff"
$$=({}+"")[5]+({}+"")[1]+({}[0]+"")[1]+((false)+"")[3]+((true)+"")[0]+((true)+"")[1]+((true)+"")[2]+({}+"")[5]+((true)+"")[0]+({}+"")[1]+((true)+"")[1];
$$$=((false)+"")[1]+((false)+"")[2]+((true)+"")[3]+((true)+"")[1]+((true)+"")[0];
$_$=({}+"")[5]+({}+"")[1]+({}+"")[1]+((false)+"")[2]+({}+"")[2+5]+({}+"")[5]+({}+"")[1]+({}[0]+"")[2]+((true)+"")[3];

// Final function call
(0)[$$][$$]($$$+"('"+$_$+"')")() 

字符串构建

(true)+"" 等于"true"(false)+"" 等于 “假”。此外,{}+"" 变为 "[object Object]"{}[0]+"" 变为 "未定义”:

// Variable declarations that "do stuff"
$$=("[object Object]")[5]+("[object Object]")[1]+("undefined")[1]+("false")[3]+("true")[0]+("true")[1]+("true")[2]+("[object Object]")[5]+("true")[0]+("[object Object]")[1]+("true")[1];
$$$=("false")[1]+("false")[2]+("true")[3]+("true")[1]+("true")[0];
$_$=("[object Object]")[5]+("[object Object]")[1]+("[object Object]")[1]+("false")[2]+("[object Object]")[2+5]+("[object Object]")[5]+("[object Object]")[1]+("undefined")[2]+("true")[3];

// Final function call
(0)[$$][$$]($$$+"('"+$_$+"')")() 

并且,将([0][1] 等)索引到这些字符串中:

$$="c"+"o"+"n"+"s"+"t"+"r"+"u"+"c"+"t"+"o"+"r";
$$$="a"+"l"+"e"+"r"+"t";
$_$="c"+"o"+"o"+"l"+" "+"c"+"o"+"d"+"e";

// Final function call
(0)[$$][$$]($$$+"('"+$_$+"')")() 

并结合:

$$="constructor";
$$$="alert";
$_$="cool code";

// Final function call
(0)[$$][$$]($$$+"('"+$_$+"')")() 

执行

现在变得有点棘手了。

(0)[$$][$$]($$$+"('"+$_$+"')")() 

(0)["constructor"]["constructor"](0).constructor.constructor 相同,并产生 Function构造函数(Number的构造函数的构造函数):

(Function)($$$+"('"+$_$+"')")()

扩展变量:

(Function)("alert"+"('"+"cool code"+"')")()

和承包:

(Function)("alert('cool code')")()

将该字符串转换为 Function 对象具有创建一个函数的效果,该函数将 eval 该代码,因此,我们最终得到:

(function() { alert('cool code') {})()

() 执行函数。

引导说明

我接受 Paypal 。

关于javascript - 你能解释一下这个非字母数字 JS 代码是如何工作的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8715228/

相关文章:

javascript - 解构或赋值运算符

javascript - YouTube 播放器 iframe 的非动态插入不会触发事件

javascript - 我无法使用 jQuery 更改工具提示 Bootstrap 位置

javascript - 如何在 TypeScript 中输入普通对象

javascript - 在 JavaScript 中分割字符串时出错

javascript - 来自 json、csv 的嵌套 html 列表

javascript - 为什么canvas元素不能绑定(bind)事件?

javascript - 如何使用Javascript登录SugarCRM?

javascript - 下载 XLSX 已损坏

javascript - Mapbox开源并使用 key ?