4

为什么++[[]][+[]]+[+[]]=10?

 3 years ago
source link: https://yanhaijing.com/javascript/2012/05/24/can-you-explain-why-10/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
为什么++[[]][+[]]+[+[]]=10?
24 May 2012
号外号外:我的新书《React状态管理与同构实战》出版啦!!!快点我查看

首先,问“这个问题(英文)”的人是个天才,他怎么会遇到这样的一个问题。 其次,回答这个问题的人更是一个天才,我难以想象他会回答这个问题,更难以想象的是,他的回答是如此的详细和丰富和完整,真正称得上诲人不倦。

既然遇到了这个问题,我们不妨也跟着提高一下。

这是一个Javascript 语言题目,一个完全有效的等式,不信自己可以试一下,下面看看高人的题解:

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

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

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

在 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" // 耶!

如果你想知道更详细的信息,请访问这里(英文)

本文问转载文章,原文:http://justjavac.com/javascript/2012/05/24/can-you-explain-why-10.html

原文网址:http://yanhaijing.com/javascript/2012/05/24/can-you-explain-why-10/

微信公众号:颜海镜关注微信公众号 颜海镜微信支付二维码赞赏支持 微信扫一扫

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK