簡體   English   中英

Javascript for-in循環怪異行為

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM