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
*/
}
谁能告诉我为什么输出不同?
答案 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 ..
循环属性。因此,如果您指定一个新属性,请name
向arr
,arr.name = "an array"
,则应在for .. in ..
循环中打印。