繁体   English   中英

javascript for-in循环

[英]javascript for-in loop

正如定义所指出的,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不应用于遍历索引顺序很重要的Array。 数组索引只是具有整数名称的可枚举属性,其他方面与常规Object属性相同。 无法保证for ... in将以任何特定顺序返回索引,并且将返回所有可枚举的属性,包括具有非整数名称的属性和被继承的属性。

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

掌握您问题答案的关键是以下句子:

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

以下句子总结了一下:

for..in不应用于遍历索引顺序很重要的Array。

数组中具有数组元素的每个索引都是该数组的属性。 因此,这基本上就是您的阵列在幕后的样子:

>>> arr

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

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

for in循环遍历键,而不是值。 因此,它给您的数组索引0、1、2而不是值。

您可以这样做,但是for in数组上使用for in是不好的做法。

for (var index in arr) {
    indexes.push(arr[index]);
}

您应该使用常规的for循环

for (var i = 0; i < arr.length; i++) {
    indexes.push(arr[i]);
}

for...in遍历对象的可枚举属性。 Array的可枚举属性是索引。

可以在此处找到更多信息。

AMCAScript 6定义了for...of运算符 ,该运算符允许对值进行迭代。 但是,这尚未被采纳。

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

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

与设置arr ['a'] = 1等相同。的确,for..in遍历键-而不是值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM