0

正如定义所说的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?它们不是属性

4

5 回答 5

2

引用自documentation

for..in 不应用于迭代索引顺序很重要的数组。数组索引只是具有整数名称的可枚举属性,在其他方面与一般 Object 属性相同。不能保证 for...in 会以任何特定顺序返回索引,并且它将返回所有可枚举的属性,包括具有非整数名称的属性和继承的属性。

因为迭代的顺序取决于实现,所以对数组进行迭代可能不会以一致的顺序访问元素。因此,在遍历访问顺序很重要的数组时,最好使用带有数字索引的 for 循环(或 Array.forEach 或非标准 for...of 循环)。

回答您的问题的关键是以下句子:

数组索引只是具有整数名称的可枚举属性,在其他方面与一般 Object 属性相同。

下面这句话总结了它:

for..in 不应用于迭代索引顺序很重要的数组。

于 2013-03-31T16:30:51.987 回答
1

数组中具有元素的数组中的每个索引都是该数组的属性。所以这基本上就是你的数组在幕后的样子:

>>> arr

    {
        0: 'a',
        1: 'b',
        2: 'c',
        'each': function() {}
        'length': 3
    };

这些键是可枚举的,这就是您在输出中看到它们的原因。

于 2013-03-31T16:30:47.543 回答
0

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]);
}
于 2013-03-31T16:29:37.790 回答
0

for...in对对象的可枚举属性进行交互。的可枚举属性Array是索引。

更多信息可以在这里找到。

AMCAScript 6 定义了允许对值进行迭代的for...of运算符。然而,这还没有被采纳。

于 2013-03-31T16:31:08.493 回答
0

是的,如果你真的想使用 for in 而不是使用键,你可以将值变成这样的键,例如:

var arr = {'a':1,'b':1,'c':1};
for(var index in arr)
indexes.push(index);

与设置 arr['a']=1 等相同。确实 for..in 迭代键 - 而不是值。

于 2013-03-31T16:38:11.240 回答