【问题标题】: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 对这个问题并没有真正的帮助,因为搜索引擎不太喜欢括号或斜线,所以如果有重复的问题,我很抱歉。

【问题讨论】:

标签: javascript


【解决方案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

    【讨论】:

      猜你喜欢
      • 2011-12-04
      • 1970-01-01
      • 2019-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-11
      • 2015-11-29
      • 1970-01-01
      相关资源
      最近更新 更多