[JavaScript] array中的empty是什么

记录一个问题,如下:

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

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

下图为v8中的Array。
https://v8docs.nodesource.com/node-0.12/d4/da0/v8_8h_source.html#l02403

v8 Array

从注释中可以看到有提到 return an empty handle,然后去查看 CloneElementAt 方法的文档。
https://v8docs.nodesource.com/node-0.12/d3/d32/classv8_1_1_array.html#a5ffd29aeceba223ea75363e6ed2ebd67

CloneElementAt

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

handle

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

v8 Array.prototype.indexOf实现
https://github.com/v8/v8/blob/master/src/runtime/runtime-array.cc#L827

v8 Array.prototype.includes实现
https://github.com/v8/v8/blob/master/src/runtime/runtime-array.cc#L725

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容