在数组元素上使用delete运算符与使用array.splice方法有什么区别?

例如:

myArray = ['a', 'b', 'c', 'd'];

delete myArray[1];
//  or
myArray.splice (1, 1);

如果我可以像删除对象那样删除数组元素,为什么还要使用拼接方法?


当前回答

如果您的阵列较小,可以使用过滤器:

myArray = ['a', 'b', 'c', 'd'];
myArray = myArray.filter(x => x !== 'b');

其他回答

好的,假设我们有下面这个数组:

const arr = [1, 2, 3, 4, 5];

让我们先删除:

delete arr[1];

结果是:

[1, empty, 3, 4, 5];

空的让我们来看看:

arr[1]; //undefined

所以意味着只是删除了值,现在它是未定义的,所以长度是相同的,也会返回true。。。

让我们重新设置阵列,这次使用拼接进行操作:

arr.splice(1, 1);

这是这次的结果:

[1, 3, 4, 5];

如您所见,数组长度已更改,arr[1]现在为3。。。

此外,这将返回数组中已删除的项目,在这种情况下为[3]。。。

拼接将使用数字索引。

而delete可以用于其他类型的索引。。

例子:

delete myArray['text1'];

我在试图理解如何从数组中删除每一个元素时偶然发现了这个问题。这里是拼接和删除的比较,用于从项数组中删除每个“c”。

var items = ['a', 'b', 'c', 'd', 'a', 'b', 'c', 'd'];

while (items.indexOf('c') !== -1) {
  items.splice(items.indexOf('c'), 1);
}

console.log(items); // ["a", "b", "d", "a", "b", "d"]

items = ['a', 'b', 'c', 'd', 'a', 'b', 'c', 'd'];

while (items.indexOf('c') !== -1) {
  delete items[items.indexOf('c')];
}

console.log(items); // ["a", "b", undefined, "d", "a", "b", undefined, "d"]
​

你可以用这样的东西

var my_array=[1,2,3,4,5,6];删除my_array[4];console.log(my_array.filter(函数(a){return typeof a!=='undefined';}));//[1,2,3,4,6]

它们是不同的东西,有不同的目的。

splice是特定于数组的,当用于删除时,会从数组中删除条目,并向上移动之前的所有条目以填补空白。(它也可以用于插入条目,或同时插入两个条目。)拼接将更改数组的长度(假设它不是无操作调用:array.splice(x,0))。

delete不是特定于数组的;它设计用于对象:它从您使用它的对象中删除属性(键/值对)。它只适用于数组,因为JavaScript中的标准(例如,非类型化)数组根本不是数组*,它们是对某些财产进行特殊处理的对象,例如名称为“数组索引”(定义为字符串名称“…其数值i在+0≤i<2^32-1”的范围内)和长度的索引。当您使用delete删除数组条目时,它所做的就是删除该条目;它不会移动后面的其他条目来填补空白,因此数组变得“稀疏”(有些条目完全缺失)。它对长度没有影响。

目前对这个问题的一些回答错误地指出,使用delete“将条目设置为undefined”。这不正确。它会完全删除条目(属性),留下一个间隙。

让我们用一些代码来说明差异:

console.log(“使用“拼接”:”);var a=[“a”,“b”,“c”,“d”,“e”];console.log(a.length);//5.a.拼接(0,1);console.log(a.length);//4.console.log(a[0]);//“b”

console.log(“使用`delete`”);var a=[“a”,“b”,“c”,“d”,“e”];console.log(a.length);//5.删除[0];console.log(a.length);//静止5console.log(a[0]);//未定义console.log(a中的“0”);//假的console.log(a.hasOwnProperty(0));//假的

console.log(“设置为`undefined`”);var a=[“a”,“b”,“c”,“d”,“e”];console.log(a.length);//5.a[0]=未定义;console.log(a.length);//静止5console.log(a[0]);//未定义console.log(a中的“0”);//真的console.log(a.hasOwnProperty(0));//真的


*(这是我贫血的小博客上的一篇文章)