首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么(([]===[])+/-/)[1] = 'a‘和(1+{})[(1<<1)+1] = 'b’在javascript中?

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

Stack Overflow用户
提问于 2014-08-25 08:01:37
回答 3查看 243关注 0票数 6

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

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

我曾努力理解这些模糊结果的评价顺序,但没有成功。

(1+{})[(1<<1)+1]为例,我了解到<<是位移位运算符,并将返回2,因此表达式成为(1+{})[3]。但是我不明白1+{}[3]是什么意思。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-08-25 08:04:06

这只是迷惑的伎俩。

例如:

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

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

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

没错:“a”

您可能还想看看这一点:

票数 5
EN

Stack Overflow用户

发布于 2014-08-25 08:04:00

1+{}的结果是一个字符串"1[object Object]"(1+{})[3]是得到索引3的字符,即b

第一个例子:

[]===[]将两个不同的对象与===进行比较,因此结果是false,其toString结果是"false"

/-/是regex对象,其toString结果是"/-/"

当您执行false + /-/时,它将连接使用.toString()的结果,因此结果将是"false/-/",第二个字符是a

票数 3
EN

Stack Overflow用户

发布于 2014-08-25 08:08:23

你可以一步一步走:

代码语言:javascript
复制
(([]===[]))

就是简单的false。转换为字符串"false/-/"并由[1]索引将给出字符串"false“的a

(1+{})也是如此,它导致字符串"1[object Object]"。1<<1+1是编写3的另一种方式,因此这会导致"1[object Object]"[3],也就是b

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25481490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档