记录一个问题,如下:
先声明一个长度为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/…