2010-01-11 9 views
4

MooTools의 배열을 반복하지만, for..in 루프를 사용하여 배열을 반복 할 때 추가 항목이 표시됩니다. 일반 for 루프를 사용하면 정상적으로 작동합니다. 글로벌 네임 스페이스를 오염시키는 MooTools에 문제가 있습니까? 아니면 여기서 뭔가 잘못하고 있습니까? for..in with MooTools를 사용하는 자바 스크립트 배열 반복 포함

0 
1 
$family 
each 
clean 
associate 
link 
contains 
extend 
getLast 
getRandom 
include 
combine 
erase 
empty 
flatten 
hexToRgb 
rgbToHex 
toJSON 

제가 제 이해 :

function createTabs() { 
    var myTabs = [["First", "a.png"], ["Second", "b.png"]]; 
    for(var i in myTabs) { 
     var tab = new Tab(myTabs[i][0], myTabs[i][1]); 
     console.log(i); 
    } 
} 

console.log(i)의 출력은 :

배열로 반복 배열의 각 값에 대한 탭을 만드는 createTabs() 함수가 2 개의 인덱스가 있지만 나머지는 어디에서 오는가?

수정 : Chetan and k Prime에 감사합니다. 그것은 의미가 있으며, MooTools가 추가 한 Array.each은 훨씬 더 깨끗한 방법입니다!

지금은 더 많이 보이는 :

myTabs.each(function(item) { 
    var tab = new Tab(item[0], item[1]); 
    console.log(item); 
}); 

답변

6

for..in이 배열의 반복을 의미하지 않습니다. 내장되지 않은 오브젝트의 모든 특성을 반복합니다. MooTools는 Array 프로토 타입에 더 많은 함수를 추가 했으므로 배열 속성이되었습니다. 이 부분을 참조하십시오 https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Statements/For...in

배열 반복을위한 기본 for 루프 만 사용하십시오.

9

Chetan이 지적했듯이 for .. in은 배열이 아니라 객체 속성 반복을 의미합니다. 그러나, 당신과 같이, hasOwnProprty을 사용하여 현재 회원들 (그리고 Mootools의 설정 상속 된 멤버)를 반복 할 수 있습니다 : 당신이 Mootools의를 사용하고 있기 때문에

for (i in array) 
    if (array.hasOwnProperty(i)) 
    { 
     //.. do stuff ... 
    } 

오어는 더 나은 아직, 그냥 Array.each를 사용 방법 :

array.each (function (item, index) 
{ 
    // ... do stuff ... 
}); 
+0

감사 프라임 K, array.each는 훨씬 쉽게 생활 – Anurag

+1

그것은 그 기능을 기반으로 반복 지적해야한다 (예 :'array.each') 정상'for' 또는'보다 훨씬 느립니다 for..in' –

+1

ECMA에 따라 곧 표준 브라우저 기능이 될 것이고 mootools는 네이티브가 있는지 확인합니다. 함수 기반 forEach에 대한 별칭을 정의 할 때 지원합니다. 따라서 성능 저하는 일시적이며 주로 오래된 브라우저에 영향을줍니다. 난 여전히 사용하지 않는 것이 좋습니다 ... 당신이 배열 키가 필요하지 않는 한 배열 걷기 (하지만 그것은 여전히 ​​해킹입니다) –