2012-01-10 3 views
1

에 부착되고 난 다음 코드를 가지고신비한 '기능'어레이

// button sets 
    var sets = ['.diamond-colour','.diamond-cut','.diamond-clarity','.diamond-certificate']; 
    // for each set 
    for (set in sets){ 
     console.log('Set: '+set); 
     console.log(sets[set]); 
    } 

콘솔 로그 쇼 :

Set: 0 
.diamond-colour 
Set: 1 
.diamond-cut 
Set: 2 
.diamond-clarity 
Set: 3 
.diamond-certificate 
Set: findIndex 
function (value){ 
var ctr = ""; 
for (var i=0; i < this.length; i++) { 
if (this[i] == value) { 
return i; 
} 
} 
return ctr; 
} 

findIndex의 키를 가진 새로운 배열 요소로 나타나고 그 값은 그 기능입니다.

누구에게 어떤 아이디어가 있고 왜 나타나는지?

답변

6

기존의 for 루프를 사용하여 배열을 반복해야합니다. 그렇지 않으면 자신 또는 제 3 자 코드가 추가 한 속성 (이 경우 새로운 함수)을 선택할 수 있습니다. 다른 언급했듯이

for(var i = 0; i < sets.length; i++) { 

는 길이를 캐싱하는 것은 최적의 성능을 제공합니다

for(var i = 0, len=sets.length; i < len; i++) { 
+2

'대 (VAR을 I = 0; I Jasper

+1

@Jasper 재미있는 테스트. 나는'for..in'이 그렇게 느리다는 것을 전혀 몰랐습니다. –

+0

@Jasper 필자의 지적은 * 배열을 위해서 * 사용하지 않는다. 그러나 그것은 확실히 유용한 정보이다. – Dennis

4

자바 스크립트의 for 루프와 in 연산자는 객체의 속성 만이 아니라 객체에 걸쳐 루프 때문이다 "Array". Javascript 배열은 실제로 배열의 각 항목에 대해 생성 된 숫자 속성이있는 객체이고 (.length과 같은 몇 가지 추가 메서드와 속성) "Array"라고 말합니다.

데니스 (Dennis)에서 언급했듯이 전통적인 for 루프를 사용하여 배열의 개체를 반복 할 수 있습니다.

또한 루프에 대한 예에 대해 쉽게 최적화 오히려마다 array.length 평가보다 루프의 시작시에 한번 길이 값을 초기화하는 참고 :

for (var i = 0, len = sets.length; i < len; i++) { 
    // ... 
} 
+1

+1 배열의 길이를 캐싱합니다. 이는 성능 향상에 도움이됩니다. http://jsperf.com/jquery-each-vs-for-loops/2 – Jasper

+0

ECMAScript 5th edition은 속성을 주석 할 수없는 것으로 열거 할 수있는 메커니즘을 제공합니다. (그러나 색인에 의한 반복은 의미 상으로 정확한 방법입니다.) –

+0

@pst 잘 알고 있습니다 만, ECMAScript 5th ed 지원이 유효하고 호환 가능한 솔루션으로 홍보하기에 충분할 때까지 얼마나 걸립니까? 이 방법을 반복하면 현재 4 번째 에디션과 5 번째 에디션에서 올바르게 작동 할 것입니다. 맞습니까? – GregL