最近,我遇到了一个有趣的网站,它展示了一个Javascript混淆器:http://bl.ocks.org/jasonsperske/5400283
例如,(([]===[])+/-/)[1]给a,(1+{})[(1<<1)+1]给b。
我曾努力理解这些模糊结果的评价顺序,但没有成功。
以(1+{})[(1<<1)+1]为例,我了解到<<是位移位运算符,并将返回2,因此表达式成为(1+{})[3]。但是我不明白1+{}和[3]是什么意思。
Google对这个问题并没有什么帮助,因为搜索引擎不太喜欢括号或斜杠,所以如果有重复的问题,我很抱歉。
发布于 2014-08-25 08:04:06
这只是迷惑的伎俩。
例如:
[]===[] ===> false
和
([]===[])+/-/ ===> "false/-/" (您可以自己在控制台中测试它)
那么,什么是(([]===[])+/-/)[1]?(第二个字符)
没错:“a”
您可能还想看看这一点:

发布于 2014-08-25 08:04:00
1+{}的结果是一个字符串"1[object Object]",(1+{})[3]是得到索引3的字符,即b。
第一个例子:
[]===[]将两个不同的对象与===进行比较,因此结果是false,其toString结果是"false"。
/-/是regex对象,其toString结果是"/-/"。
当您执行false + /-/时,它将连接使用.toString()的结果,因此结果将是"false/-/",第二个字符是a。
发布于 2014-08-25 08:08:23
你可以一步一步走:
(([]===[]))就是简单的false。转换为字符串"false/-/"并由[1]索引将给出字符串"false“的a。
(1+{})也是如此,它导致字符串"1[object Object]"。1<<1+1是编写3的另一种方式,因此这会导致"1[object Object]"[3],也就是b。
https://stackoverflow.com/questions/25481490
复制相似问题