簡體   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