如何理解javascript中运行 “++[[ ]][0]” 语句会得到1?

新手上路,请多包涵

此问题来源于看这篇文章js隐式装箱-ToPrimitive 中有关于隐式类型转换的叙述,但是看到文章倒数第二部分的一个例子的时候,产生了疑惑:

clipboard.png

其中的第三步,即++[[]][0] 也就等于++[]。

但是直接运行++[],会产生如下报错:

clipboard.png

改成 + +[] 的方式执行,也只能得到0,不能得到1.

思索许久还是不能理解,望各位不吝赐教!

阅读 2.7k
3 个回答
其中的第三步,即++[[]][0] 也就等于++[]。但是直接运行++[],会产生如下报错:

原因:JavaScript权威指南-第6版-中p72

clipboard.png

[[]][0] 是数组元素,[] 是数组,所以[[]][0] 不报错,[] 报错;

改成 + +[] 的方式执行,也只能得到0,不能得到1.

原因:JavaScript高级程序设计-第3版-中p38

clipboard.png

所以题主的这个代码+ +[]相当于:

+ +[]
+ Number([])//Number([])===0
+ 0
var a=[];
++a

这就和 ++1 不能正常运行一样

++ 这个操作符后面必须跟一个引用,然后原值会被ToNumber

clipboard.png
RTF tc39

如果跟的不是一个引用,那自然就抛错咯:

++1      // 错
i = ++[] // 错
i = ++1  // 错

翻了一下犀牛书,说++的「操作数是一个左值(lvalue)(变量、数组元素或对象属性)」,这一句也能解释你的问题。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题