先来看看效果,大家先想想://下面这句话会打印什么?[+[][0]+[]][0][1]直接看效果:打印一个字母不够,打印一个句子如何?//请注意,在Chrome浏览器中,打印[[][0]+[]][0][5]+[[][[[][0]+[]][0][4]+[[][0]+[]][0][5]+[[][0]+[]][0][1]+[[][0]+[]][0][2]]+[]][0][8]+[[[]==[]][0]+[]][0][2]+[[][[[][0]+[]][0][4]+[[][0]+[]][0][5]+[[][0]+[]][0][1]+[[][0]+[]][0][2]]+[]][0][6]+[[][[[][0]+[]][0][4]+[[][0]+[]][0][5]+[[][0]+[]][0][1]+[[][0]+[]][0][2]]+[]][0][23]+[[][0]+[]][0][3]+[[][[[][0]+[]][0][4]+[[][0]+[]][0][5]+[[][0]+[]][0][1]+[[][0]+[]][0][2]]+[]][0][8]+[+[1+[[][0]+[]][0][3]+309][0]+[]][0][7]+[[][[[][0]+[]][0][4]+[[][0]+[]][0][5]+[[][0]+[]][0][1]+[[][0]+[]][0][2]]+[]][0][6]+[[][0]+[]][0][0]来看看效果吧:基础测试如果你想知道上面是怎么实现的是的,首先检查你对JavaScript隐式类型转换的理解://下面的值会打印什么?console.log(+[]);console.log(1+[]);console.log(+undefined);console.log([]==[]);console.log(+[]==+[]);如果你不能准确陈述上面的结果,或者想深入理解上面的转换过程,建议先阅读两篇文章:JavaScriptTopicHeadacheTypeConversion(Part1).mdJavaScriptTopicHeadacheTypeConversion(Part2).md开始解密第一个效果:[][0]因为空数组没有第一个元素,所以会打印undefined第二个效果:undefined+[]undefined+[]相当于undefined+"",结果是"undefined"字符串。这时候已经得到了一个未定义的字符串,我们只需要通过下标就可以得到对应的字母。但是,如果我们不使用括号,我们如何获取值呢?这时候我们就需要用到一个技巧:第三个效果:['undefined'][0][0]这个时候我们就得到了字母“u”。通过改变下标,我们可以得到u,n,d,e,f,i的6个字母是不是很有趣,但这仅仅是个开始。NaN第一个效果:+undefined相当于Number(undefined),结果为NaN第二个效果:NaN+[]相当于NaN+""结果为NaNstring第三个效果:[NaN][0][1]这样我们就可以得到字母a。false的第一个效果:[]==[]结果自然是false注意,因为前面两个例子的铺垫,可能大家已经逐渐明白,取出一个值的时候,如果转成字符串,如果去掉下标的字母第二种效果://转成字符串值+[]false+[]第三种效果://取字母['false'][0][0by[value][0][n]]我们可以取出字母f。这样,我们就可以取出“f”、“a”、“l”、“s”、“e”这五个字母。True直接看核心步骤:+[]==+[]相当于比较“”==“”,结果自然为真,剩下的想必大家都很熟悉了。通过以上4种方式获得的字母还是有限的,我们还需要一些其他的方法来获得更多的字母。注意无穷大:我们之前已经得到了字母e。+("1e309")转换成数字后,相当于1乘以10的309次方,大于JavaScript中的最大数,所以结果会是Infinity。其余步骤同上,不再赘述。我们可以从中提取t和y函数注意:到目前为止,我们已经获得了undefitrfalsty,从中我们可以拼写“find”字符串。[]["find"]会显示数组的查找函数,结果为:functionfind(){[nativecode]}通过这个方法,我们可以得到cov。但是要注意:取字母v在这种方式会造成兼容性问题!!!神奇的构造函数注意,我们有17个字母,我们现在可以拼写“constructor”了!constructor是一个神奇的属性,因为通过它,我们可以得到各种类型值对象的构造函数!0["constructor"]//functionNumber(){[nativecode]}""["constructor"]//functionString(){[nativecode]}...通过上面的方法,我们可以取m和g也许我们会问,“”怎么表达呢?[]+[]===""//truename有m,我们现在可以拼name了,但是name有什么用呢?"to"+""["constructor"]["name"]//"toString"我们的最终目标是拼出通用的"toString"字符串。之所以拼出toString,是因为我们使用toString方法可以表示26个字母!这时候就要介绍一下平时看起来不起眼的toString方法了,但它确实是这里最后的主角!以下引用自W3C学派:功能:toString()方法可以将一个Number对象转换成一个字符串并返回结果。用法:NumberObject.toString(radix)参数说明:radix:表示数字的基数,是2到36之间的整数,如果省略该参数,则以10为基数。但是,需要注意的是,如果参数不是10,则ECMAScript标准允许实现返回任何值。例如:varnumber=newNumber(10);number.toString('16');system来表示,上面的例子打印的结果是“a”。请注意,radix最多可以表示36!!!varnumber=newNumber(35);number.toString('36');打印出来的字母是“z”!这样,我们就可以代表所有剩下的字母了!但是我们如何使用这个toString方法呢?准确的说,我们如何生成一个数字对象呢?还是拼新号?其实大可不必!这时候JavaScript隐式类型转换的优秀之处就凸显出来了:35["toString"](36)//z注意:此时我们也得用()!至此,我们已经可以表示所有的字母了,有的容易表示,有的比较麻烦,而且显示的也很长,比如字母p:25[[[+[]==+[]][0]+[]][0][0]+[[][[[][0]+[]][0][4]+[[][0]+[]][0][5]+[[][0]+[]][0][1]+[[][0]+[]][0][2]]+[]][0][6]+[[]+[]][0][[[][[[][0]+[]][0][4]+[[][0]+[]][0][5]+[[][0]+[]][0][1]+[[][0]+[]][0][2]]+[]][0][3]+[[][[[][0]+[]][0][4]+[[][0]+[]][0][5]+[[][0]+[]][0][1]+[[][0]+[]][0][2]]+[]][0][6]+[[][0]+[]][0][1]+[[[]==[]][0]+[]][0][3]+[[+[]==+[]][0]+[]][0][0]+[[+[]==+[]][0]+[]][0][1]+[[][0]+[]][0][0]+[[][[[][0]+[]][0][4]+[[][0]+[]][0][5]+[[][0]+[]][0][1]+[[][0]+[]][0][2]]+[]][0][3]+[[+[]==+[]][0]+[]][0][0]+[[][[[][0]+[]][0][4]+[[][0]+[]][0][5]+[[][0]+[]][0][1]+[[][0]+[]][0][2]]+[]][0][6]+[[+[]==+[]][0]+[]][0][1]][[[][0]+[]][0][1]+[+[][0]+[]][0][1]+[0[[[][[[][0]+[]][0][4]+[[][0]+[]][0][5]+[[][0]+[]][0][1]+[[][0]+[]][0][2]]+[]][0][3]+[[][[[][0]+[]][0][4]+[[][0]+[]][0][5]+[[][0]+[]][0][1]+[[][0]+[]][0][2]]+[]][0][6]+[[][0]+[]][0][1]+[[[]==[]][0]+[]][0][3]+[[+[]==+[]][0]+[]][0][0]+[[+[]==+[]][0]+[]][0][1]+[[][0]+[]][0][0]+[[][[[][0]+[]][0][4]+[[][0]+[]][0][5]+[[][0]+[]][0][1]+[[][0]+[]][0][2]]+[]][0][3]+[[+[]==+[]][0]+[]][0][0]+[[][[[][0]+[]][0][4]+[[][0]+[]][0][5]+[[][0]+[]][0][1]+[[][0]+[]][0][2]]+[]][0][6]+[[+[]==+[]][0]+[]][0][1]]+[]][0][11]+[[][0]+[]][0][3]]](27)其他近期创作公众号,搜索“SaeYu的JavaScript博客”或“yayujs”,文章将第一时间发送。收到推送后,还是推荐阅读各个平台的系列博客。JavaScript系列目录地址:https://github.com/mqyqingfen...如有错误或不准确的地方,请指正,万分感谢。如果你喜欢或者有启发,欢迎star,这也是对作者的鼓励。
