使用undefined和delete删除数组元素有什么区别?

3

MDN定义了以下差异,但我并不理解其中的区别。我创建了一个数组,然后删除了一个元素,然后尝试调用该元素,结果返回undefined。

var ary=[0,1,2,3,4];
delete ary[3];
ary[3]// returns undefined
ary.length //returns 5

var ary2=[0,1,2,3,4];
ary2[2]=undefined
ary2[2]// returns undefined
ary2.length// returns 5

删除数组元素时,数组长度不会受到影响,即使你删除的是数组的最后一个元素也是如此。

使用delete运算符删除数组元素后,该元素将不再属于该数组。在以下示例中,使用delete删除了trees[3]元素。

var trees = ["redwood","bay","cedar","oak","maple"];
delete trees[3];
if (3 in trees) {
// this does not get executed
}

如果你想让一个数组元素存在但是值为undefined,使用undefined值而不是delete操作符。在下面的示例中,trees[3]被赋值为undefined,但是数组元素仍然存在:
var trees = ["redwood","bay","cedar","oak","maple"];
trees[3] = undefined;
if (3 in trees) {
// this gets executed
}

数组长度...这是主要的事情。还有索引。 - Praveen Kumar Purushothaman
这两种方法都没有真正地“删除”元素。你是在询问如何真正删除一个元素吗? - Jamiec
我很好奇它们之间的区别是什么。MDN描述了一个区别,但对我来说,它们似乎以相同的方式影响数组,所以我认为我错过了什么。看起来它们都删除了一个数组元素,但是留下了一个空槽的数组,但长度相同。 - Brandon
2个回答

2

想象一下:

var a = [1, 2, 3];
a[1] = undefined;
console.log('1' in a); // true
delete a[1];
console.log('1' in a); // false
console.log(a.length); // 3
console.log(a); // [1, undefined, 3]

如果您想从数组中删除某个元素,应使用splice方法:

var a = [1, 2, 3];
a.splice(1, 1);
console.log(a.length); // 2
console.log(a); // [1, 3]

splice的参数如下:
array.splice(start, deleteCount[, item1[, item2[, ...]]])

在MDN上了解更多


1

由于数组实际上就是对象,因此删除操作会从对象中删除“3”键,而不会对其他内容进行更改。然而,将第三个元素设置为未定义并不会删除键3,而是将其值设置为未定义。


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