为什么在JavaScript中,(([]===[])+/-/)[1] = 'a',而且(1+{})[(1<<1)+1] = 'b'?

6

最近我发现了一个有趣的网站,展示了Javascript混淆器:http://bl.ocks.org/jasonsperske/5400283

例如,(([]===[])+/-/)[1]会得出a(1+{})[(1<<1)+1]会得出b

我曾经努力尝试理解这些混淆结果的评估顺序,但是徒劳无功。

(1+{})[(1<<1)+1]为例,我知道<<是位移运算符,会返回2,所以表达式变成了(1+{})[3]。但是我不明白1+{}[3]的意思。

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


表达式结果被字符串化,索引用作字符串的charAt函数。 - Silviu Burcea
相关内容:https://dev59.com/GWQo5IYBdhLWcg3whPzI - Qantas 94 Heavy
3个回答

5

这只是一些混淆技巧。

例如:

[]===[] ===> false

以及

([]===[])+/-/ ===> "false/-/"(您可以在控制台中自行测试)

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

没错:'a'

您可能还想看一下这个:

enter image description here


1
但是为什么 []===[] 会得到 false?它们不是相同的空数组吗? - Pingu
3
你比较“引用(reference)”。一个新的空数组与另一个新的空数组有不同的地址。 - Royi Namir

3

您可以逐步进行:

(([]===[]))

仅仅是false。将其转换为字符串"false/-/"并通过索引[1]得到字符串"false"的a

(1+{})同样如此,结果为字符串"1[object Object]"。 而1<<1+1是另一种写法,表示3,因此结果为"1[object Object]"[3],也就是b


3
1+{}的结果是一个字符串"1[object Object]"(1+{})[3]是获取索引3处的字符,即b
第一个例子: []===[] 使用===比较两个不同的对象,所以结果为false,其toString结果为"false"/-/是一个正则表达式对象,其toString结果为"/-/"
当你执行false + /- / 时,它将使用.toString()的结果进行连接,因此结果将是"false/-/",第二个字符是a

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接