JavaScript-你能解释为什么++[[]][+[]]+[+[]] = 10吗?

JavaScript-你能解释为什么++[[]][+[]]+[+[]] = 10吗?

夜无邪 发布于 2016-12-24 字数 190 浏览 1175 回复 4

在Javascript中,++[[]][+[]]+[+[]]是合法的,并且返回结果为10

更多的奇怪结果可以查看:http://sla.ckers.org/forum/read.php?24,33349,33405

请问有哪位同学能解释这是为什么?

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

浮生未歇 2017-10-01 4 楼

大家都对这个表达式究果推因地进行了分析,但运算符“+”的作用真是变化莫测:
1、操作对象全部都为Number,表示算术运算符;
2、前置运算符"+" 后面是任何类型的操作对象,都会将其后操作对象转换为Number;

alert(typeof (+'')); //number 0
alert(+[]); //转换为Number 0

3、“+”连接任意不同类型的操作对象,都将其转换为字符串类型,这确实令人费解

alert(typeof ([]+{})); //string
alert(1+[]); // "1"
alert(1+[0]); //"10"

夜无邪 2017-08-12 3 楼

很有意思,测试了下,结果是字符串"10"。
+[] 是 0,
所以 [+[]] 是 [0],取数组的第一个元素,
++ 需要lvalue,而[[]]是个唯一元素为空数组的数据,
[[]][+[]] 就是 [[]][0],就是 [],并且是个lvalue,
因此用于++后结果是1,
1+[0],[0]是数组,在这个表达式中转为字符串"0"。

灵芸 2017-06-25 2 楼

++[[]][+[]]+[+[]]
分三段理解
++[[]][+[]] == 1
+ 这是连接符
[+[]] == 0
因为[]这个在js中是空对象嘛·或者理解为空数组 就是null值 嘛
+[]会自动专换成0值
大概就这个意思

晚风撩人 2017-06-25 1 楼

把这段表达式拆分开来,它相等于:

++[[]][+[]]
+
[+[]]

在JavaScript里,+[] === 0 是完全正确的。 + 会把一些字符转化成数字,在这里,这个式子会变成 +”" 或 0。

++[[]][0]
+
[0]

因为 [[]][0] 的意思是:获取 [[]] 的第一个元素,这就得出了下面的结果:
[[]][0] 返回内部数组 ([])。根据语言规范,我们说 [[]][0] === [] 是不正确的,但让我们把这个内部数组称作 A,以避免错误的写法。
++[[]][0] == A + 1, 因为 ++ 的意思是“加一”。
++[[]][0] === +(A + 1);换句话说,你得到的永远是个数值( +1 并不一定得到的是个数值,但 ++ 一定是)。
同样,我们可以把这一堆代码简化的更清晰。让我们把 A 换回成 [] :
因此,我们可以简化一下(++ 比 + 有更高的优先级):

+([] + 1)
+
[0]

在JavaScript里,这也是正确的:[] + 1 === “1″,因为 [] == “” (这相当于一个空的数组的内部元素连接),于是:
+([] + 1) === +(“” + 1),并且
+(“” + 1) === +(“1″),并且
+(“1″) === 1
让我们再次简化一下:

1
+
[0]

同样,在Javascript里,这是正确的:[0] == “0″,因为这是相当于一个有一个元素的数组的内部元素的连接。各元素会使用,分隔。当只有一个元素时,你可以推论出这个过程的结果就是它自身的第一个元素。
所以,最终我们得到(数字 + 字符串 = 字符串):

1
+
"0"

=== "10"

这部分内容摘自这以下链接,stackoverflow解释的非常详细,不得不佩服牛人

1.为什么 ++[[]][+[]]+[+[]] = 10 ?
2.Can you explain why ++[[]][+[]]+[+[]] = 10