从数组中删除项目,为什么for和for在输出中有所不同?

时间:2012-07-26 04:00:28

标签: javascript arrays for-loop for-in-loop

var arr = ["a", "b", "c",null,undefined];

delete arr[0];

for (var i = 0,j=arr.length; i < j; i++) {
    console.log(arr[i]);
    /*
    undefined
    b
    c
    null
    undefined
    */
}

for (var o in arr) {
    console.log(arr[o]);
    /*
    b
    c
    null
    undefined
    */
}

谁能告诉我为什么输出不同?

3 个答案:

答案 0 :(得分:1)

您可以通过密钥访问;

数组索引是数组对象的关键

使用delete关键字,删除对象键 因为

delete arr[0]; // key "0" deleted!

OK?

并看到这个

var arr = ["a", "b", "c",null,undefined];
delete arr[0]; // key "0" deleted!

// access by i,  with key : 0
for (var i = 0,j=arr.length; i < j; i++) {
    console.log(i);
    /*
    0 
    1 
    2 
    3 
    4 
    */
}

// access by object key, without key : 0
for (var o in arr) {
    console.log(o);
    /*
    1
    2
    3
    4 
    */
}​​​​​​​​​​
祝你好运!

答案 1 :(得分:1)

实际上delete不会从数组中删除元素,只会将元素设置为未定义,要从数组中删除项目使用splice,如下所示

var arr = ["a", "b", "c",null,undefined];
arr.splice(0, 1);

现在您的数组如下

["b", "c", null, undefined]

但您使用delete从数组中删除第一项,如下所示

delete arr[0];

然后你的阵列如下所示

[undefined × 1, "b", "c", null, undefined]

所以,在你使用的第一个循环中

for (var i = 0,j=arr.length; i < j; i++) {
    console.log(arr[i]);
}

它使用数组的索引迭代数组,因此(在第一次循环中)arr[i]表示arr[0]undefined,在你的第二个循环中使用

for (var o in arr) {
    console.log(arr[o]);
}

这实际上非常适合与一个对象一起使用循环,但你使用了一个数组,我认为它还应该显示数组的其他属性,并且真的很困惑你是如何得到这些(b c null undefined)值的,除非你使用hasOwnProperty

for (var o in arr) {
    if(arr.hasOwnProperty(o)) console.log(arr[o]);
}

无论如何,它会迭代对象的所有可用属性,不应与数组一起使用。在使用hasOwnProperty迭代array时,请检查this fiddle以了解for in的工作原理以及在不使用此方法的情况下应该获得的内容。

答案 2 :(得分:0)

给定一个空数组array = []array[0]返回undefined,因为位置0中没有存储项目。删除arr[0]后,那里没有数据。循环for .. in ..迭代数组中的所有元素,因此返回b c null undefined。更具体地说,对象中的for .. in ..循环属性。因此,如果您指定一个新属性,请namearrarr.name = "an array",则应在for .. in ..循环中打印。