正如定义所说的for-in循环用于循环对象的属性,而不是为什么循环数组的元素?
var arr = ['a','b','c'], indexes = [];
Array.prototype.each = function() {/*blah*/};
for (var index in arr) {
indexes.push(index);
}
indexes; //["0", "1", "2", "each"]
为什么要枚举 0,1,2?它们不是属性
正如定义所说的for-in循环用于循环对象的属性,而不是为什么循环数组的元素?
var arr = ['a','b','c'], indexes = [];
Array.prototype.each = function() {/*blah*/};
for (var index in arr) {
indexes.push(index);
}
indexes; //["0", "1", "2", "each"]
为什么要枚举 0,1,2?它们不是属性
引用自documentation
:
for..in 不应用于迭代索引顺序很重要的数组。数组索引只是具有整数名称的可枚举属性,在其他方面与一般 Object 属性相同。不能保证 for...in 会以任何特定顺序返回索引,并且它将返回所有可枚举的属性,包括具有非整数名称的属性和继承的属性。
因为迭代的顺序取决于实现,所以对数组进行迭代可能不会以一致的顺序访问元素。因此,在遍历访问顺序很重要的数组时,最好使用带有数字索引的 for 循环(或 Array.forEach 或非标准 for...of 循环)。
回答您的问题的关键是以下句子:
数组索引只是具有整数名称的可枚举属性,在其他方面与一般 Object 属性相同。
下面这句话总结了它:
for..in 不应用于迭代索引顺序很重要的数组。
数组中具有元素的数组中的每个索引都是该数组的属性。所以这基本上就是你的数组在幕后的样子:
>>> arr
{
0: 'a',
1: 'b',
2: 'c',
'each': function() {}
'length': 3
};
这些键是可枚举的,这就是您在输出中看到它们的原因。
for
in
循环遍历键,而不是值。所以它给你的数组索引 0, 1, 2 而不是值。
你可以这样做,但for in
在数组上使用 a 是不好的做法。
for (var index in arr) {
indexes.push(arr[index]);
}
您应该使用常规for
循环
for (var i = 0; i < arr.length; i++) {
indexes.push(arr[i]);
}
是的,如果你真的想使用 for in 而不是使用键,你可以将值变成这样的键,例如:
var arr = {'a':1,'b':1,'c':1};
for(var index in arr)
indexes.push(index);
与设置 arr['a']=1 等相同。确实 for..in 迭代键 - 而不是值。