从数组中删除项目,为什么输出中的 for 和 for 不同

Delete item from array , why for and for in output are different?

本文关键字:for 不同 输出 为什么 数组 删除项目      更新时间:2024-03-23
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
    */
}

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

您可以通过密钥访问;

数组

索引是数组对象的键

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

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

祝你好运!

实际上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的工作原理以及使用 for in 迭代array时不使用此方法时应该获得什么。

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