为什么javascript中的(([] === [])+ / - /)[1] ='a'和(1 + {})[(1<< 1)+1] ='b'?

时间:2014-08-25 08:01:38

标签: javascript

最近我遇到了一个有趣的网站,它说明了一个Javascript Obfuscator:http://bl.ocks.org/jasonsperske/5400283

例如,(([]===[])+/-/)[1]提供a(1+{})[(1<<1)+1]提供b

我努力了解这些混淆结果的评估顺序但是徒劳无功。

(1+{})[(1<<1)+1]为例,我了解<<是按位移位运算符,将返回2,因此表达式变为(1+{})[3]。但后来我无法理解1+{}[3]是什么意思。

谷歌对这个问题并没有什么帮助,因为搜索引擎不喜欢括号或斜线,所以如果有重复的问题,我很抱歉。

3 个答案:

答案 0 :(得分:5)

这只是混淆技巧。

例如:

[]===[] ===&gt; false

([]===[])+/-/ ===&gt; "false/-/"(你可以自己在控制台中测试它)

那么(([]===[])+/-/)[1]是什么? (第二个字符)

这是对的:'a'

可能希望看一下这个:

enter image description here

答案 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