删除究竟如何工作



请检查 jsfiddle - http://jsfiddle.net/du8svaym/

var a = [2, 4, "bang", undefined, NaN, 5];
for (i in a)
alert(a[i]); //alerting a[3]=undefined
delete a[1];
for (i in a)
alert(a[i]); //Why not alerting a[1]= undefined?
alert(a[1]); //it is undefined! but not alerted, what is happening under the hood?

如果您注意到,第一个循环警报会提醒未定义的值。在第二个循环警报中,a[1] 未定义,因为我们删除了它,但没有警报。两个未定义之间有什么区别,删除设置未定义究竟如何或不同?

delete运算符从对象中删除属性。数组是JavaScript对象,如下所示:

var foo = {
  '0': 2,
  '1': 4,
  '2': "bang",
  '3': undefined, 
  '4': NaN,
  '5': 5
}
delete foo[1]; // completely removes the property '1' from foo.
console.log(foo);
// outputs:
{
  '0': 2,
  '2': "bang",
  '3': undefined, 
  '4': NaN,
  '5': 5
}

对于第一次迭代,数组如下所示。

[0: 2, 1: 4, 2: "bang", 3: undefined, 4: NaN, 5: 5]

现在,删除 a1 后,它会删除 4。所以,现在数组看起来像

[0: 2, 2: "bang", 3: undefined, 4: NaN, 5: 5]

现在,如您所见,a1 不存在。所以它给出了未定义。

删除元素不会影响数组长度,因为它不会更改索引。如果希望数组索引受到影响,请使用拼接

JavaScript 数组是稀疏的,这意味着它们不必在每个位置存储一个值。删除会删除位置处的值,使其稀疏。

试试这个

a = []; // empty array
a[1000] = 'hello';
for (i in a) {
    console.log(i);
}
console.log(a.length)

您将看到它只会在循环中打印 1000,而数组的长度为 1001

最新更新