[英]Javascript for-in loop bizarre behavior
突然,我看到一個奇怪的行為。 這是一個片段:
// attributesList is an object with properties 0, 1, 2.
for (var j in attributesList) {
// this loop should run 3 times.
var attribute = attributesList[j];
}
從上面可以看到,循環應該運行3次。 但是由於某些非常奇怪的原因,它被運行了4次。 對於最后一次迭代,j ==“ seek”的值。
甚至更陌生,這個相同的代碼庫也可以在另一個git分支上運行(無更改)。 這似乎僅在我從特定git分支運行時才發生。
對於這種神秘的“尋求”屬性,是否有任何邏輯解釋? 我嘗試研究的一件事可能是javascript版本和其他版本差異...但是這里沒有運氣。
* 更新 *
attributesList是對象類型的數組。
有問題的對象具有四個可枚舉的屬性。 它可能從其原型對象繼承了seek
,這就是為什么您認為它只有三個屬性。
您對MikeC的評論增加了重點:
當我在運行/調試期間評估attributeList時,沒有看到任何名為“ seek”的屬性
和您的更新一樣:
attributesList是對象類型的數組。
這告訴我們,在您的代碼庫中的某個地方(可能是在插件中),有人很調皮,並向Array.prototype
添加了一個可枚舉的屬性。 他們可以使用各種不同的語法來做到這一點。 如果只是一個屬性( seek
),則可能是這樣的:
Array.prototype.seek = function() {
// ...
};
那是很差的做法,他們應該使它無法枚舉:
Object.defineProperty(Array.prototype, "seek", {
value: function() {
// ...
}
});
但是從根本上說, for-in
並不是用於遍歷數組。 請參閱我的其他答案,以了解如何遍歷數組。
這個長答案的兩個摘錄:
用於forEach
:
attributesList.forEach(function(attribute) {
// ...
});
或者,如果您確實要使用for-in
,請添加hasOwnProperty
檢查:
for (var j in attributesList) {
if (attributesList.hasOwnProperty(j)) {
// this loop should run 3 times.
var attribute = attributesList[j];
}
}
或者當然使用for
循環。 有關詳細信息,請參見答案 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.