Javascript 我是否应该使用`delete array[x];array.length-=1`而不是'array.splice(x,1)`?

Javascript 我是否应该使用`delete array[x];array.length-=1`而不是'array.splice(x,1)`?,javascript,html,web-applications,Javascript,Html,Web Applications,我想从数组中删除一个项,array.splice(x,1)是最好的方法吗 是数组。拼接(x,1)功能等同于删除数组[x];数组.长度-=1 我读过这些帖子:而且 并做了一些测试: <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); }

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

数组。拼接(x,1)
功能等同于
删除数组[x];数组.长度-=1

我读过这些帖子:而且

并做了一些测试:

<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>

var-arr=[];

对于(var x=0;x删除数组元素只会将它们设置为
未定义的
——这就是为什么它这么快的原因。它不会删除元素。减少数组的长度会使情况变得更糟,因为数组长度根本没有改变


换句话说:对问题标题的回答是“否”,您应该使用
splice()
以达到预期效果。只有在代码处理了
未定义的
元素的可能性时,才能使用“删除”技巧来实现更高的性能。这可能很有用,但与“从数组中删除项”无关。

删除数组元素只会将它们设置为
未定义的
-这就是我为什么t太快了。它不会删除元素。减少数组的长度会使情况变得更糟,因为数组长度根本不会改变


换句话说:对问题标题的回答是“否”,您应该使用
splice()
以达到预期效果。只有当代码处理了
未定义的
元素的可能性时,才可以使用删除“技巧”来实现更高的性能。这可能很有用,但与“从数组中删除项”无关。

数组。splice
可以执行与拼接

您的
delete array[x];array.length-=1
只是对公共界面进行了修改,并假设内部没有其他事情可做

事实上,这就是时间差异的原因:为了实际拼接阵列,内部还有很多工作要做


使用正确的接口。这就是它存在的原因。

阵列。拼接
可以执行与拼接相关的其他内部操作

您的
delete array[x];array.length-=1
只是对公共界面进行了修改,并假设内部没有其他事情可做

事实上,这就是时间差异的原因:为了实际拼接阵列,内部还有很多工作要做


使用正确的接口。这就是它存在的原因。

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

具体而言,ECMAScript规范第15.4节规定:

每当更改length属性时,名称为数组索引且其值不小于新长度的每个属性都会自动删除

MDC概述了上述两种方法:


这两种方法都适合您的情况-如果您从中获得更好的性能,请务必修改
长度。

如果您只是删除数组中的最后一个元素,则可以使用
pop()
并扔掉结果,或者将长度减少1。这里甚至不需要使用
delete
操作符,而
splice()
更适合其他用途

具体而言,ECMAScript规范第15.4节规定:

每当更改length属性时,名称为数组索引且其值不小于新长度的每个属性都会自动删除

MDC概述了上述两种方法:


这两种方法都适合您的情况-如果您能从中获得更好的性能,请务必修改
长度。

使用
删除
不会删除元素。在
删除somearr[n]
删除somearr[n]
仍然存在,但其值为
未定义
。有几种方法可以从数组中删除元素

  • 在一个或多个元素的数组中:
    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));
}

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

  • 在一个或多个元素的数组中:
    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));
}

第二个片段不做你想做的事情:你试图一次又一次地删除元素<代码> 49999 <代码>,而不是最后一个元素。此外,如果你想删除数组中间的某个东西,你不能简单地<代码>删除< /代码>该项,并将<代码>长度<代码>属性减少1。这很好,这不是你的实际问题的答案,只是一句话。Tomalak的回答更好,所以我支持他。第二段不做你想做的事情:你试图一次又一次地删除元素<代码> 49999 <代码>,而不是最后一个元素。此外,如果你想删除数组中间的某个东西,你可以。不仅仅是
del