How does the following piece of expression evaluates to “10”
我最近看到一个来源的表达式,它看起来像下面这样-
在chrome(Windows7,版本27.0.1453.94m)控制台中输入该命令会显示"10"的结果。
有人能解释一下这里发生了什么吗?
JSFiddle。
Javascript是在数据类型之间转换的公平灵活的。首先要注意的是+[]Evaluates to 0.?The first thing to notice is that +[]evaluates to 0.*that lets us rewrite the expression as:
ZZU1
通知的下一件事是++[[]][0]是应用于[[]]第一元素的初步操作员。通常你不能在一个阵列中应用++,但Javascript kindly converts the first element to 0,结果是++[[]][0]evaluates to 1([[]]having now been incremented)。It's kind of like this:
1 2 3
| var a = [[]];
var b = ++a[0];
// now a will be [1] and b will be 1 |
让我们与:
Javascript now converts the int and the array to strings(since EDOCX1&15)is not a numberic value)and concatenates them together.Done!
我对如何成为+[]的理解是,这是一个两步的过程:第一步,[]是转化为一条原始的弦乐,这是空气的弦乐。空气弦转换成一个数字,这个数字是零。经由同一条路,[1]Evaluates to '1'and then to 1,[2]2EDOCX1〕EValuates to [1, 2]'1,2'Which evaluates to NaN。最后,因为分隔点是.,而不是,。我不知道如果我的地方不一样会发生什么
- 我基本上是这么想的。只是想知道如何将[[]][0]转换为0部分。在此过程中遵循哪种转换规则?
- @sayemahmed-虽然++不能应用于数组,但它可以应用于数组元素。[[]]的第一个元素是[];试图将++应用于触发JS将[]转换为0(就像对+[]一样)。
- 好吧,我明白你的意思。我只是觉得++操作符的行为有点难以理解。你不能把它应用到我得到的数组中。但是,当您将它应用于数组元素时,如果该元素本身是数组,那么它会转换为基元吗?ECMA规范是否在某个地方列出了这种行为?
- @Sayemahmed-&167;11.4.4说,++Expr通过评估ToNumber(GetValue(Expr))开始(经过一些错误检查)。§;9.3规定,对象参数的ToNumber从评估ToPrimitive(value, Number)开始。反过来,(per&167;9.1)调用对象的[[DefaultValue]]内部方法。§;8.12.8描述当提示类型为数字时,[[DefaultValue]]如何为对象工作。指定的过程基本上是我描述的:转换为字符串(在第一次尝试使用valueOf()转换为基元失败之后),然后将其解析为数字(per&167;9.3)。
是从阵列到0的一个数字转换。
也就是说
因此,最终的结果可以传达给(++0) + [0],这是1+[0]。
并为一个数字添加一个阵列。他们正在谈论如何加强,结果实际上是10。
你可以测量
这是一个有效的表达式,它是由Yelds NaN、Numbers、Boolean undefined等构造的。
E.G.
1 2 3
| +[] -> 0 //The unary plus operator is applied to the result of toString applied to an empty array (which is an empty string)
!+[] -> true |
你也可以看着这个问题,在无尽的土壤上And at the no alnum cheat sheets.
- 我知道那部分。我把表达量减到了++[[]][0]+[0],只是不知道1是怎么上来的……
- 好吧,我看作弊单上把++[[]][+[]]列为等同于1的,但没有给出任何解释……