删除如何正常工作?

时间:2014-12-30 11:19:08

标签: javascript arrays undefined

请检查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?

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

3 个答案:

答案 0 :(得分:2)

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
}

答案 1 :(得分:1)

对于第一次迭代,数组看起来像这样。

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

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

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

现在,您可以看到1不存在。所以它给出了undefined。

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

答案 2 :(得分:0)

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

试试这个

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

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