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