[JavaScript] array中的empty是什么

925 阅读1分钟
原文链接: www.jianshu.com

记录一个问题,如下:

先声明一个长度为3的数组。
arr[0]打印出来都是undefined,使用undefined比较也返回true。但是使用indexOf查找的时候发现,返回-1。???
后来把arr[0]赋值为undefined,使用indexOf查找,返回0,正常了。

然后尝试从v8引擎中寻找答案。

下图为v8中的Array。
v8docs.nodesource.com/node-0.12/d…

v8 Array

从注释中可以看到有提到 return an empty handle,然后去查看 CloneElementAt 方法的文档。
v8docs.nodesource.com/node-0.12/d…

CloneElementAt

文档中提到,如果clone失败,就返回 an empty handle
于是接着去寻找 handle
v8docs.nodesource.com/node-0.8/d4…
下图为 Handle 类,描述是一个由v8垃圾收集器管理的对象引用。

handle

结论:an empty handle 是一个空的由v8垃圾收集器管理的对象引用,不是 undefined,所以arr.indexOf(undefined)返回-1。

v8 Array.prototype.indexOf实现
github.com/v8/v8/blob/…

v8 Array.prototype.includes实现
github.com/v8/v8/blob/…