delete array[i]
与array[i] = undefined
相同吗?我知道前者会产生稀疏数组吗?后者是否也这样做?
答案 0 :(得分:2)
不,后者不会这样做,只是将该索引设置为值undefined
,它不会删除该索引。
delete
将删除索引,但不会更新长度,因此您最终会得到一个真正未定义的索引,并且不会包含值undefined
。<登记/>
换句话说,&#34;稀疏&#34;长度大于项目数的数组。
您可以使用大多数数组方法轻松测试,因为它们将迭代值undefined
,但不会超过未定义的索引(存在差异)
var arr = [0, 1, 2, 3];
delete arr[1]; // delete the second index
arr.forEach(function(item) {
console.log(item); // 0, 2, 3
});
console.log('--------')
var arr2 = [0, 1, 2, 3];
arr2[1] = undefined; // set the second index to "undefined"
arr2.forEach(function(item) {
console.log(item); // 0, undefined, 2, 3
});
&#13;
答案 1 :(得分:1)
不,他们不这样做。来自MDN's delete
operator article:
删除数组元素
删除数组元素时,数组长度不受影响。即使您删除了数组的最后一个元素,这也成立。
当
delete
运算符删除数组元素时,该元素不再在数组中。在以下示例中,trees[3]
已移除delete
。var trees = ['redwood', 'bay', 'cedar', 'oak', 'maple']; delete trees[3]; if (3 in trees) { // this does not get executed }
如果要存在数组元素但值为
undefined
,请使用未定义的值而不是delete
运算符。在以下示例中,trees[3]
被赋值undefined,但数组元素仍然存在:var trees = ['redwood', 'bay', 'cedar', 'oak', 'maple']; trees[3] = undefined; if (3 in trees) { // this gets executed }
答案 2 :(得分:0)
通过使用两者可以使密集阵列稀疏或不稀疏。它们的用法不同。
让我们看看......
var arr = [1,2,3];
delete arr[10]; // <- returns true but arr is not sparse
delete arr[1]; // <- returns true and arr is now sparse
var arr = [1,2,3];
arr[1] = undefined; // <- arr is not sparse
arr[10] = undefined; // <- arr is now sparse