最近我遇到了一个有趣的网站,它说明了一个Javascript Obfuscator:http://bl.ocks.org/jasonsperske/5400283
例如,(([]===[])+/-/)[1]
提供a
,(1+{})[(1<<1)+1]
提供b
。
我努力了解这些混淆结果的评估顺序但是徒劳无功。
以(1+{})[(1<<1)+1]
为例,我了解<<
是按位移位运算符,将返回2,因此表达式变为(1+{})[3]
。但后来我无法理解1+{}
和[3]
是什么意思。
谷歌对这个问题并没有什么帮助,因为搜索引擎不喜欢括号或斜线,所以如果有重复的问题,我很抱歉。
答案 0 :(得分:5)
这只是混淆技巧。
例如:
[]===[]
===&gt; false
和
([]===[])+/-/
===&gt; "false/-/"
(你可以自己在控制台中测试它)
那么(([]===[])+/-/)[1]
是什么? (第二个字符)
这是对的:'a'
你可能希望看一下这个:
答案 1 :(得分:3)
1+{}
的结果是字符串"1[object Object]"
,(1+{})[3]
是获取索引3的字符b
。
第一个例子:
[]===[]
使用===
比较两个不同的对象,结果为false
,其toString结果为"false"
。
/-/
是一个正则表达式对象,其toString结果为"/-/"
当您使用false + /-/
的结果执行.toString()
时,结果将为"false/-/"
,第二个字符为a
。
答案 2 :(得分:3)
你可以一步一步走:
(([]===[]))
只是false
。转换为字符串"false/-/"
并按[1]
编制索引,为您提供字符串的a
&#34; false&#34;。
同样适用于(1+{})
,这导致字符串"1[object Object]"
。
并且1&lt;&lt; 1 + 1是写3
的另一种方式,因此这会产生"1[object Object]"[3]
,这只是b
。