JavaScript-你能解释为什么++[[]][+[]]+[+[]] = 10吗?
在Javascript中,++[[]][+[]]+[+[]]是合法的,并且返回结果为10
更多的奇怪结果可以查看:http://sla.ckers.org/forum/read.php?24,33349,33405
请问有哪位同学能解释这是为什么?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
大家都对这个表达式究果推因地进行了分析,但运算符“+”的作用真是变化莫测:
1、操作对象全部都为Number,表示算术运算符;
2、前置运算符"+" 后面是任何类型的操作对象,都会将其后操作对象转换为Number;
alert(typeof (+'')); //number 0
alert(+[]); //转换为Number 0
3、“+”连接任意不同类型的操作对象,都将其转换为字符串类型,这确实令人费解
alert(typeof ([]+{})); //string
alert(1+[]); // "1"
alert(1+[0]); //"10"
很有意思,测试了下,结果是字符串"10"。
+[] 是 0,
所以 [+[]] 是 [0],取数组的第一个元素,
++ 需要lvalue,而[[]]是个唯一元素为空数组的数据,
[[]][+[]] 就是 [[]][0],就是 [],并且是个lvalue,
因此用于++后结果是1,
1+[0],[0]是数组,在这个表达式中转为字符串"0"。
++[[]][+[]]+[+[]]
分三段理解
++[[]][+[]] == 1
+ 这是连接符
[+[]] == 0
因为[]这个在js中是空对象嘛·或者理解为空数组 就是null值 嘛
+[]会自动专换成0值
大概就这个意思
把这段表达式拆分开来,它相等于:
++[[]][+[]]
+
[+[]]
在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