资讯专栏INFORMATION COLUMN

Why is ++[[]][+[]]+[+[]] = “10”?

chnmagnus / 1896人阅读

Source: http://stackoverflow.com/questions/7202157/why-is-10

If we split it up, the mess is equal to:

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

In JavaScript, it is true that +[] === 0. + converts something into a number, and in this case it will come down to +"" or 0 (see specification details below).

Therefore, we can simplify it (++ has precendence over +):

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

Because [[]][0] means: get the first element from [[]], it is true that:

[[]][0] returns the inner array ([]). Due to references it"s wrong to say [[]][0] === [], but let"s call the inner array A to avoid wrong notation.

++[[]][0] == A + 1, since ++ means "increment by one".

++[[]][0] === +(A + 1); in other words, it will always be a number (+1 does not necessarily return a number, whereas ++ always does - thanks to Tim Down for pointing this out).

Again, we can simplify the mess into something more legible. Let"s substitute [] back for A:

+([] + 1)
+
[0]

In JavaScript, this is true as well: [] + 1 === "1", because [] == "" (joining an empty array), so:

+([] + 1) === +("" + 1), and

+("" + 1) === +("1"), and

+("1") === 1

Let"s simplify it even more:

1
+
[0]

Also, this is true in JavaScript: [0] == "0", because it"s joining an array with 1 element. Joining will concatenate the elements separated by ,. With one element, you can deduce that this logic will result in the first element itself.

So, in the end we obtain (number + string = string):

1
+
"0"

=== "10" // Yay!

Specification details for +[]:

This is quite a maze, but to do +[], first it is being converted to a string because that"s what + says:

  

11.4.6 Unary + Operator

The unary + operator converts its operand to Number type.

The production UnaryExpression : + UnaryExpression is evaluated as follows:

Let expr be the result of evaluating UnaryExpression.

Return ToNumber(GetValue(expr)).

ToNumber() says:

  

Object

Apply the following steps:

Let primValue be ToPrimitive(input argument, hint String).

Return ToString(primValue).

ToPrimitive() says:

  

Object

Return a default value for the Object. The default value of an object is retrieved by calling the [[DefaultValue]] internal method of the object, passing the optional hint PreferredType. The behaviour of the [[DefaultValue]] internal method is defined by this specification for all native ECMAScript objects in 8.12.8.

[[DefaultValue]] says:

  

8.12.8 [[DefaultValue]] (hint)

When the [[DefaultValue]] internal method of O is called with hint String, the following steps are taken:

Let toString be the result of calling the [[Get]] internal method of object O with argument "toString".

If IsCallable(toString) is true then,

a. Let str be the result of calling the [[Call]] internal method of toString, with O as the this value and an empty argument list.

b. If str is a primitive value, return str.

The .toString of an array says:

  

15.4.4.2 Array.prototype.toString ( )

When the toString method is called, the following steps are taken:

Let array be the result of calling ToObject on the this value.

    

Let func be the result of calling the [[Get]] internal method of array with argument "join".

If IsCallable(func) is false, then let func be the standard built-in method Object.prototype.toString (15.2.4.2).

Return the result of calling the [[Call]] internal method of func providing array as the this value and an empty arguments list.

So +[] comes down to +"", because [].join() === "".

Again, the + is defined as:

  

11.4.6 Unary + Operator

The unary + operator converts its operand to Number type.

The production UnaryExpression : + UnaryExpression is evaluated as follows:

Let expr be the result of evaluating UnaryExpression.

Return ToNumber(GetValue(expr)).

ToNumber is defined for "" as:

  

The MV of StringNumericLiteral ::: [empty] is 0.

So +"" === 0, and thus +[] === 0.

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/85289.html

相关文章

  • 从 Quora 的 187 个问题中学习机器学习和NLP

    摘要:许多的顶尖研究人员都会积极的在现场回答问题。虽然有许多主题的常见问题页面比如,这是一个机器学习的,但是这些都是非常不全面的,或者不够精致。在这篇文章中,我试图做一个更加全面的有关机器学习和问题的。 作者:chen_h微信号 & QQ:862251340微信公众号:coderpai简书地址:http://www.jianshu.com/p/ac18... showImg(https:/...

    hidogs 评论0 收藏0
  • 《DeepLearning.ai 深度学习笔记》发布,黄海广博士整理

    摘要:在这堂课中,学生将可以学习到深度学习的基础,学会构建神经网络,包括和等。课程中也会有很多实操项目,帮助学生更好地应用自己学到的深度学习技术,解决真实世界问题。 深度学习入门首推课程就是吴恩达的深度学习专项课程系列的 5 门课。该专项课程最大的特色就是内容全面、通俗易懂并配备了丰富的实战项目。今天,给大家推荐一份关于该专项课程的核心笔记!这份笔记只能用两个字形容:全面! showImg(...

    wenhai.he 评论0 收藏0
  • [gist]Why do we still need Evernote since there is

    from http://oyanglul.us Im a Emacs user and as you may know there is a awesome mode called gist.el, and since then, I found that its completely...

    philadelphia 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<