Javascript编译器行为 - 对于空数组和零数组的数组加倍是.. ONE

obe*_*iro 3 javascript

我的问题可能已经回答了,但我找不到搜索引擎中的谷歌或者bing不喜欢'+'(加号)登录搜索请求.

无论如何,为什么这是零

+[[]][0] // = 0
Run Code Online (Sandbox Code Playgroud)

这是一个

++[[]][0] // = 1
Run Code Online (Sandbox Code Playgroud)

UPD: Michael Berkowski有一个很好的答案,但我偷了不明白一件事

如果[[]][0]计算结果为空数组,那么,为什么++[]是ReferenceError: Invalid left-hand side expression in prefix operation

UPD2: 现在我明白了......似乎我试图在控制台中键入++ 0并获得错误,但我应该使用var a = 0; ++一个

Mic*_*ski 8

通过分解其组件评估的方式可以最好地探索这一点.

[[]][0]单独评估空数组[].通过+在前面添加,您可以通过一元正运算符将其字符串表示形式转换为整数0(如说+4或-3). +0只是0.

++作为数字运算符,也将空字符串强制转换为整数0,但应用其操作(前缀增量) 1.

[[]][0]
// [] empty array
[[]][0].toString()
// ""

// Unary + casts the empty string to an integer
+("")
// 0

// Prefix increment on an empty string results in 1 (increments the 0)
var emptyString = "";
++emptyString;
// 1
Run Code Online (Sandbox Code Playgroud)

  • 更确切地说,`++`首先转换为整数然后(pre)递增.这就是你不需要`++(+ [[]] [0])`的原因. (2认同)