2009-10-15 14 views
0

Mootools的奇怪的錯誤衝突嘗試運行下面的代碼:使用jQuery

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> 
<script> b = jQuery.noConflict(true); </script> 

<script src="http://ajax.googleapis.com/ajax/libs/mootools/1.2.3/mootools-yui-compressed.js"></script> 
<script> 
    (function($){ 
    $.a = function(){ 
     var x = []; 
     for (l in x){ 
     console.log(l); 
     } 
    }; 
    })(b); 

    b.a(); 
</script> 

即使x是空的,在console.log你會看到一些值。這是爲什麼發生?我的智慧結束了。

有人可以請建議如何解決這個問題。

回答

3

MooTools的嚴重extendsArray.prototype,而你是一個for...in聲明迭代的數組。

此聲明用於迭代對象屬性,對於陣列,推薦使用傳統的forwhile循環。

爲什麼?,因爲for...in語句會像您注意到的那樣爬上原型鏈,同樣因爲迭代順序是任意的,所以遍歷數組可能無法訪問數字順序中的元素。

但是,如果您仍想使用此語句進行迭代,則可以在循環內進行檢查,以確保您將迭代的屬性直接存在於對象上,而不是原型鏈上的某處,使用hasOwnProperty功能:

var x = []; 
for (l in x){ 
    if (x.hasOwnProperty(l)) { 
    console.log(l); 
    } 
} 
+0

現在這是一個真正的頭痛,因爲我使用數百for循環。 – 2009-10-15 06:28:12

+0

好的,我做到了。 mootools還有哪些擴展?這很煩人,因爲我在noConflict模式下使用jQuery。我如何控制mootools? – 2009-10-15 06:32:28

+1

mootools擴展了很多東西,但通常這並不重要。無論您是否使用mootools,您都應該非常謹慎。當然,對於數組迭代,您應該始終堅持標準的'for(var i = 0; i bobince 2009-10-15 09:25:26