为啥 (([]===[])+/-/)[1] = 'a' 和 (1+)[(1<<1)+1] = 'b' 在 javascript 中?

Posted

技术标签:

【中文标题】为啥 (([]===[])+/-/)[1] = \'a\' 和 (1+)[(1<<1)+1] = \'b\' 在 javascript 中?【英文标题】:Why is (([]===[])+/-/)[1] = 'a' and (1+)[(1<<1)+1] = 'b' in javascript?为什么 (([]===[])+/-/)[1] = 'a' 和 (1+)[(1<<1)+1] = 'b' 在 javascript 中? 【发布时间】:2014-08-25 08:01:37 【问题描述】:

最近我遇到了一个有趣的网站,它展示了一个 javascript 混淆器:http://bl.ocks.org/jasonsperske/5400283

例如,(([]===[])+/-/)[1] 给出a(1+)[(1&lt;&lt;1)+1] 给出b

我努力去理解这些混淆结果的求值顺序,但徒劳无功。

(1+)[(1&lt;&lt;1)+1]为例,我理解&lt;&lt;是移位运算符,会返回2,所以表达式变成(1+)[3]。但后来我无法理解1+[3] 是什么意思。

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

【问题讨论】:

表达式结果被字符串化,索引用作字符串的charAt函数。 相关:***.com/questions/15978204/… 【参考方案1】:

这只是混淆技巧。

例如:

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

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

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

没错:'a'

可能也想看看这个:

【讨论】:

但是为什么[]===[]会给出假?它们不是相同的空数组吗? @Pingu 你比较references。一个新的空白数组与另一个新的空白数组的地址不同。【参考方案2】:

你可以一步一步来:

(([]===[]))

就是false。转换为字符串 "false/-/" 并由[1] 索引,为您提供字符串“false”的a

(1+) 也是如此,导致字符串 "1[object Object]"。 13 的另一种写法,所以这会导致"1[object Object]"[3],即b

【讨论】:

【参考方案3】:

1+的结果是一个字符串"1[object Object]"(1+)[3]是获取索引3的char为b

第一个例子:

[]===[]===比较两个不同的对象,所以结果是false,其toString结果是"false"

/-/是一个正则表达式对象,其toString结果为"/-/"

当你做false + /-/时,它将使用.toString()的结果进行连接,所以结果将是"false/-/",第二个字符是a

【讨论】:

以上是关于为啥 (([]===[])+/-/)[1] = 'a' 和 (1+)[(1<<1)+1] = 'b' 在 javascript 中?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 1+++2 = 3?

为啥 ('1'+'1') 在 Java 中输出 98? [复制]

为啥 EigensCount 不能大于 TrainingImagesCount-1 [EigenObjectRecognizer]

为啥 (1)JDBC 代码有效而 (2) 无效?

为啥 1/1/1970 是“纪元时间”?

为啥 ^*$ 匹配“127.0.0.1”