1 | var a = []; |
这里产生了一个稀疏数组,a[1]这里是一个 empty slot。在谷歌浏览器控制台内显示样子如下:
delete 操作符也能产生一个 empty,以上面的数组a为例子。
1 | delete a[2]; |
在谷歌浏览器控制台内显示样子如下:
用new Array(3)方法也会生成 empty slot。
empty和刻意赋值为undefined有差别吗?
从第一个例子看到,a[1]返回的值是undefined。那么这和我们直接赋值a[1]为undefined有差别吗?
有差别。看下面的例子:
1 | var a = [1, , 3]; // [1,empty,3] |
我们发现,map方法会跳过a数组的 empty slot,而不会跳过被显式设为undefined的b[1]项。
不仅仅是map方法,还有很多与遍历数组相关的操作都为跳过 empty slot。
我测试了所有我能想到与数组相关的操作,列出了以下两个列表。
会跳过 empty slot 的操作
1 | var a = [1, , 3]; |
不会跳过 empty slot 的操作
以下列出我们可能误以为会跳过 empty slot 的操作,实际上下面的操作不会跳过 empty slot。尤其是下面的for..of操作需要特别注意。
1 | var a = [1,,3]; // [1,empty,3] |
总结
不给数组内的某个 slot 赋值,或使用delete操作数组,或用new Array生成数组都会生成 empty slot。大部分与遍历相关的方法和操作会跳过 empty slot;但有几个操作例外,尤其要注意for..of循环。