0
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
    */
}

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

4

3 回答 3

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]);
}

无论如何,它会迭代对象的所有可用属性,并且不应该与数组一起使用。检查this fiddle以了解在迭代usinghasOwnProperty时不使用此方法的工作原理以及您应该得到什么。arrayfor in

于 2012-07-26T04:36:36.320 回答
1

您可以通过密钥访问;

数组索引是数组对象的键

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

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

好?

看到这个

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 
    */
}​​​​​​​​​​

祝你好运!

于 2012-07-26T04:05:12.147 回答
0

给定一个空数组array = []array[0]返回undefined,因为位置 0 中没有存储项目。删除后arr[0],那里没有数据。循环for .. in ..遍历数组中的所有元素,所以它返回b c null undefined. 更具体地说,for .. in ..循环对象中的属性。因此,如果您分配一个新属性,比如name, arrarr.name = "an array"它将被for .. in ..循环打印。

于 2012-07-26T04:06:40.703 回答