2013-10-25 89 views
2

這似乎是從最新的Chrome更新開始的,我試圖找到關於它的信息但未成功。請看下面的代碼:Chrome向數組添加'remove'元素?

var lines = ['asdf','qwer','']; 
for (var i in lines) console.log(i, lines[i]); 

如果我運行在Firefox的「螢火蟲」控制檯,我的輸出,符合市場預期,這就是:

0 asdf 
1 qwer 
2 (an empty string) 

然而,當我在Chrome控制檯運行,我得到這個:

0 asdf 
1 qwer 
2 
remove function (from, to) 
{ 
    var rest = this.slice((to || from) + 1 || this.length); 
    this.length = from < 0 ? this.length + from : from; 

    return this.push.apply(this, rest); 
} 

我注意到額外的「刪除」項目定期提出。問題是,它打破幾個jQuery插件,我下載使用,其中有這樣的代碼:

for (var i in lines) { 
    line = lines[i].split("="); 
    ... 

由於額外的元素是一個函數,而不是一個字符串,它不具備split()函數,所以我的代碼在錯誤的軌道上停下來。我不想通過手動從數組中刪除元素來完成所有的代碼,那麼是否有一些標誌可以設置,或者我可以在執行前運行,以防止添加額外的元素?

+4

請*不要*用陣列中的'for ... in' –

+0

chrome究竟是什麼版本?看起來這更像是一個插件向數組原型添加'remove'的插件。 – numbers1311407

+4

'(var in array)'包含繼承的屬性。你應該使用數字迭代或者檢查'lines.hasOwnProperty(i)'。見http://stackoverflow.com/questions/3010840/loop-through-array-in-javascript/3010848#3010848 – Barmar

回答

2

這看起來像一個經典的原因,你爲什麼不應該使用構造for (var i in lines)來枚舉數組中的條目。

for (var i in lines)構造枚舉數組對象的屬性,包括超出數組數組索引的東西,例如添加的屬性和可枚舉的方法。

如果使用for (var i = 0, len = lines.length; i < len; i++),則只會枚舉數組中的實際項目。


我們在這裏猜測是,你正在使用一些第三方的庫增加了.remove()方法將數組對象,因此當你遍歷數組的任何實例的枚舉的屬性,你也得到remove財產。

如果切換到for (var i = 0, len = lines.length; i < len; i++)數組枚舉方法,則不會出現此問題。

for (var i = 0, len = lines.length; i < len; i++) { 
    line = lines[i].split("="); 
    ... 
} 

僅供參考,lines.hasOwnProperty(i)也可以用來工作,解決此問題,但如果你只是wnat枚舉數組項,你應該只使用枚舉陣列的正確方法。

+0

這是一切都很好,但在這一點上,我有一個非常大的網站,直到最近工作,現在沒有。我不想通過40,000行代碼尋找'for ... in'的實例並替換它們。再次,這隻發生在Chrome,而不是Firefox。有沒有辦法阻止這種情況發生? – DiMono

+0

@DiMono - 你的代碼是錯誤的,你已經將它與第三方庫結合在一起,這會讓你錯誤的代碼中斷。您可以通過刪除添加'.remove'屬性或修復代碼的第三方庫來修復它。嚴重的是,使用帶有大量第三方代碼的'for(i in line)'是一個滴答作響的定時炸彈,它只是在你身上爆炸。你真的應該修正你的代碼。如果您現在不修復您的代碼並找到一些解決方法,那麼您的錯誤代碼將來可能會再次爆炸。好的軟件工程師會花時間修復錯誤的代碼。 – jfriend00

+0

這不是我寫的代碼,它主要是第三方的jQuery插件。但是,我已經證實,在裸露的Chrome窗口中不會發生。所以這確實是與另一個插件添加.remove屬性。謝謝你的回答,表明這可能是問題,現在是時候去打獵了。 – DiMono