[英]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.