当前位置:Gxlcms > JavaScript > 深入分析下javascript中的[]()+!_javascript技巧

深入分析下javascript中的[]()+!_javascript技巧

时间:2021-07-01 10:21:17 帮助过:10人阅读

这个东西也不是新鲜玩意了,很久之前就见过,但是一看到那一大坨代码,实在是提不起一点研究的兴趣。无奈今天碰到这样一道题目,只好决定深入研究一下。

关于上面的题目,有必要多说几句。实际上题目并没有要求一定只有[]()+!这六个字符,要求会宽松不少,不过题目描述中并没有说明的很清楚。而且运行环境是node,这样导致并没有window,history,document这些对象。更没有window.atob();和window.atob();这两个函数。总之那道题与我这篇文章并没有多大关系。不过在通过题目之后,就可以看到别人的解决办法。果然有高人只用到6种字符就解决问题了。我虽然通过了,但是用到了其它函数,然后我就开始研究别人的代码了。下面就是我的收获。

最重要的就是得到任意的数字

得到1之后就可以得到任意数字了

有些人可能会问123这么大的数字怎么办,难道要写123个。这里有个技巧:

上面已经得到所有数字了,接下来想办法得到所有字符。
首先想到的就是如果我有一个字符串s="abcdefg";那么s[0]="a";s[1]="b";就可以得到很多字符了。不过我们必须先得到一个字符串才行。
比较容易想到的几个字符串如下:

上面的字符串通过数字下标可以提取出不少字符,但是显然也有不少字符还是得不到。比如m,S等。这时候该constructor出场了。
怎么出场呢?很不巧的是上面的字符串中刚好足够凑出constructor这个字符串,于是我们可以得到:

但是字符还是不全啊。。。,这个时候,就有人想歪主意了。不过所有的原则就是转换,例如把数字转为字符,把一个字符转为另一个字符。

第一个办法是window.atob();和window.btoa();这是base64的加密和解密

这个方法是我一开始在网上找到的,后来发现node环境下没有这两个方法,所以只能用下面的方法了,不过字符长度增加很多。

第二个办法是window.escape();和window.unescape();这是html实体的编解码

比如escape("<")的结果是%3C,取第一个字符得到%;有了%,在加上数字就可以解码出很多字符了,比如:

第三个办法是利用数字进制之间的转换。Number.toString(36);

比如211..toString(31)的结果是6p,再取第二个字符就可以得到p字符了。

下面的代码可以输出"Hello World!",我已经加上注释了,其中用到的技巧都已经在上面列出来了。

以上所述就是本文的全部内容了,希望大家能够喜欢。

人气教程排行