为啥 (([]===[])+/-/)[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<<1)+1]
给出b
。
我努力去理解这些混淆结果的求值顺序,但徒劳无功。
以(1+)[(1<<1)+1]
为例,我理解<<
是移位运算符,会返回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'+'1') 在 Java 中输出 98? [复制]
为啥 EigensCount 不能大于 TrainingImagesCount-1 [EigenObjectRecognizer]