【问题标题】:should i use `delete array[x]; array.length-=1` instead of `array.splice(x,1)`?我应该使用`删除数组[x]; array.length-=1` 而不是`array.splice(x,1)`?
【发布时间】:2026-01-22 01:20:03
【问题描述】:

我想从数组中删除一个项目,array.splice(x,1) 是最好的方法吗?

array.splice(x,1) 在功能上是否等同于 delete array[x]; array.length-=1

我已阅读以下主题:Javascript object with array, deleting does it actually remove the item?Deleting array elements in JavaScript - delete vs splice

并做了一些测试:

<script>
var arr=[];
for(var x=0;x<100000;++x){
    arr.push(x);
}
var a=new Date().getTime();
for(var x=0;x<50000;++x){
    arr.splice(49999,1);
}
var b=new Date().getTime();
alert(b-a);
</script>

<script>
var arr=[];
for(var x=0;x<100000;++x){
    arr.push(x);
}
var a=new Date().getTime();
for(var x=0;x<50000;++x){
    delete arr[49999];
    arr.length-=1;
}
var b=new Date().getTime();
alert(b-a);
</script>

时间差超过 100 的幅度,使得使用第二种解决方案的痒几乎无法抗拒.. 但在使用它之前,我想问一个问题:我使用时是否应该注意任何陷阱delete array[x]; array.length-=1 而不是 array.splice(x,1)

【问题讨论】:

  • 第二个 sn-p 没有做你想做的事:你试图一遍又一遍地删除元素 49999,而不是最后一个元素。此外,如果你想删除数组中间的某些东西,你不能简单地delete那个项目并将length属性减1。
  • @marc 你应该把它作为答案。太棒了
  • 不,这不是您实际问题的答案,只是一个评论。 Tomalak 的回答更好,所以我支持他。

标签: javascript html web-applications


【解决方案1】:

如果您只是删除数组中的最后一个元素,您可以使用 pop() 并丢弃结果或将长度减 1。这里甚至不需要 delete 运算符,而 @ 987654325@更适合其他用途。

具体来说,ECMAScript 规范的第 15.4 节说:

每当长度属性发生变化时,所有名称为数组索引且值不小于新长度的属性都会被自动删除

MDC 概述了提到的两种方法:

两者都适合您的情况 - 如果您从中获得更好的性能,请务必修改 length

【讨论】:

  • @Raynos:谢谢,这很有趣...pop() 在 Chrome 11 和 IE 9 中为我赢得了胜利 :-)
【解决方案2】:

array.splice 可以执行与拼接相关的其他内部操作。

您的delete array[x]; array.length-=1 只是绕过公共界面并假设内部没有其他事情可做。

事实上,这就是时间差的原因:为了实际上拼接数组,内部还有很多要做.

使用正确的界面。这就是它存在的原因。

【讨论】:

  • 如果说假设delete array[x]; array.length-=1; 有效,还有什么可做的......(但在马塞尔的评论之后,我知道它没有,我的意思是假设它是否有效)
  • @Pent:不要以为它有效。因为它没有。使用正确的界面。
  • @Pent:在内部,splice 必须将元素 after 移动到被移除项目的起始位置,并调整 length 属性并返回一个新的创建了包含那些已删除项目的数组。这就是为什么splice() 不是您正在做的事情的合适方法(因为它做的比您需要做的更多,而其他方法做得完全正确)。忽略不必要的delete 声明,array.length-=1 将起作用并且非常好。
  • @AndyE:确实,pop 对于特定用例会更好。但我正在回答这个问题。
【解决方案3】:

使用delete 不会删除元素。在delete somearr[n] somearr[n] 之后仍然存在,但它的值为undefined。有几种方法可以从数组中删除元素。

  • 在一个或多个元素的数组中:Array.splice
  • 从数组的末尾(即最后一个元素):Array.pop() 或者可能是Array.length = Array.length-1
  • 从数组的开头(即第一个元素):Array.shift()Array.slice(1)

完整地说,使用Array.slice 你也可以组成一个函数:

function deleteElementsFromArray(arr,pos,n){
  return arr.slice(0,pos).concat(arr.slice(pos+n));
}

【讨论】:

    【解决方案4】:

    删除数组元素只是将它们设置为undefined - 这就是它如此之快的原因。它不会删除元素。减少数组的长度会使情况变得更糟,因为数组长度根本不会改变!

    换句话说:对你的问题标题的回答是,你应该使用splice()来达到预期的效果。只有当您的代码处理undefined 元素的可能性时,您才能使用删除“技巧”来获得更高的性能。这可能很有用,但它与“从数组中删除一个项目”无关。

    【讨论】:

    • 在 ECMA-262 第 5 版之前,甚至可以将 undefined 定义为某个值,这使得 undefined 非常糟糕。
    • @Yet - 在这种情况下这并不重要,因为使用delete 总是将元素的值设置为undefined,无论您是否将undefined 的值设置为其他值。这仅在您自己使用原语时才重要。
    • 我不确定推荐使用splice() 来完成pop() 的工作是否合适。就本问题的意图和目的而言,pop()length-=1 都有意义,但 splice()delete 没有意义。