数组的splice和将值设为null的区别

4
你应该使用array.splice(i,1)代替array[i] = null。这将保留数组中的键。
来源:Should I bother cleaning array in node.js? 我不太理解这句话。为什么array[i]=null会改变数组的键?为什么array.splice(i,1)更好?

请参阅JavaScript数组删除元素 - Bergi
这完全没有更好的说法。一切取决于你想要实现什么目标。 - webduvet
如果你想提高性能,那么将其设置为 null 是更好的选择(V8 会优化数组,而调整索引会阻止它正确地进行优化)。如果你需要从数组中删除一个项目,则使用 splice 是正确的方法。这取决于你想要做什么。 - Sverri M. Olsen
2个回答

5
array.splice(i, 1);会从数组中删除元素,因此更改了数组的length
array[i] = null仅将索引i处的值设置为null,不会改变数组长度。这与delete array[i]相同,除了delete运算符将索引处的值设置为undefined
关于

为什么array[i] = null会更改数组的键?

我认为缺少一个单词“not”,应该是:

为什么array[i] = null 不会 更改数组的键(或者说更改length)?

第二个问题:

为什么array.splice(i, 1);更好?

它通过从数组中删除元素来改变数组的length。因此,在迭代数组时,您不必检查if(value == null)
完全取决于使用情况,哪种方法更好。

2
所以我认为splice并不比其他方法更好,只是用法不同而已。谢谢。 - Magus
@Magus:实际上,splice 的速度要慢得多,因为它必须调整所有索引。 - Bergi

0

通过一个简单的测试用例,很容易看出行为上的差异。这是Chrome从控制台输出的内容:

var test = ['a','b','c']
test[1] = null
["a", null, "c"]

var test = ['a','b','c']
test.splice(1, 1)
["a", "c"]

var test = ['a','b','c']
delete test[1]
["a", undefined × 1, "c"]

正如您所看到的,splice 是唯一一个将 c 的索引从 2 更改为 1 的方法。

您想使用哪个取决于您的用例。可能有这样一种情况,您有一个固定长度的数组,并且您想删除一个项目而不影响其后的项目索引,在这种情况下,剪切将不合适。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接