记录一个问题,如下:
先声明一个长度为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
从注释中可以看到有提到 return an empty handle
,然后去查看 CloneElementAt
方法的文档。
https://v8docs.nodesource.com/node-0.12/d3/d32/classv8_1_1_array.html#a5ffd29aeceba223ea75363e6ed2ebd67
文档中提到,如果clone失败,就返回 an empty handle
。
于是接着去寻找 handle
。
https://v8docs.nodesource.com/node-0.8/d4/da0/v8_8h_source.html#l00178
下图为 Handle
类,描述是一个由v8垃圾收集器管理的对象引用。
结论: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
网友评论