'array [i] = undefined'会产生稀疏数组吗?

时间:2017-09-11 09:13:27

标签: javascript arrays

delete array[i]array[i] = undefined相同吗?我知道前者会产生稀疏数组吗?后者是否也这样做?

3 个答案:

答案 0 :(得分:2)

不,后者不会这样做,只是将该索引设置为值undefined,它不会删除该索引。

delete将删除索引,但不会更新长度,因此您最终会得到一个真正未定义的索引,并且不会包含值undefined。<登记/> 换句话说,&#34;稀疏&#34;长度大于项目数的数组。

您可以使用大多数数组方法轻松测试,因为它们将迭代值undefined,但不会超过未定义的索引(存在差异)

&#13;
&#13;
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;
&#13;
&#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