请检查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是多么完全或不同?
答案 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