2012-06-20 4 views
2

그래서 나는이 배열을 만들이 기능프로토 타입 함수가 반복되는 이유는 무엇입니까?

Array.prototype.containsCaseInsensitive = function(obj) { 
    var i = this.length; 
    while (i--) { 
    if (this[i].toUpperCase() === obj.toUpperCase()) { 
     return true; 
    } 
    } 
    return false; 
} 

가 :

0 
1 
2 
3 
function(obj) { 
    var i = this.length; 
    while (i--) { 
     if (this[i].toUpperCase() === obj.toUpperCase()) { 
      return true; 
     } 
    } 
    return false; 
} 

왜 반복의 기능은 다음과 같이

ary = [0,1,2,3]; 
for (item in ary){ 
    console.log(ary[item]) 
} 

출력은? 감사합니다.

답변

4

귀하의 속성은 열거 가능합니다 (어쨌든 for ... in ...을 사용하여 배열 키를 열거해서는 안됨). 안전하게 Object.defineProperty를 사용하여 비 열거 속성으로 해당 기능을 추가 할 수 있습니다 ES5 호환 브라우저에

는 :

Object.defineProperty(Array.prototype, 'containsCaseInsensitive', { 
    value: function() { 
     ... 
    } 
}); 
+0

유일한 문제는 버전이 1.8.5이므로 브라우저 호환성이 저하된다는 것입니다. 어떤 경우에는 요소를 더 잘 필터링한다고 생각합니다. – Gustavo

0

for .. in을 사용하면 배열이 개체로 처리되므로 모든 속성이 표시됩니다. 규칙 효과를 사용하여 원하는 효과를 얻으십시오.

0

은 배열의 구성원이므로 배열의 모든 구성원을 반복합니다. 배열의 항목을 반복 처리하려면 for ... in 반복을 작성하면 안됩니다.

0

for..in은 개체의 모든 열거 가능 속성을 출력하기 때문에. 당신이 배열의 값을 원하는 경우

, 당신은 사용할 수 있습니다

for (item in ary){ 
    if (ary.hasOwnProperty(item)) 
     console.log(ary[item]) 
} 

를 지원하는 환경에서, 당신은 또한이 같은 비 열거로서 기능을 설정하는 defineProperty를 사용할 수 있습니다

Object.defineProperty(Array.prototype, 'containsCaseSensitive', { 
    value: function(obj) {}, 
    enumerable: false 
    //^this is default when you use defineProperty, so you don't need it 
    // but it is to show you how that works :-) 
}); 

그러나 배열의 경우 일반적으로 for..in을 사용하지 않는 것이 좋습니다. 리터럴 개체에만 사용하십시오. 지원되는 경우,

for (var i = 0, l = arr.length; i < l; i++) { 
    console.log(arr[ i ]); 
} 

또는 :

배열

, 사용하는 것이 좋습니다 당신은 개체의 모든 속성을 통해 반복하는

arr.forEach(function(el) { 
    console.log(el); 
}); 
+0

나는 "지원되는 경우"절은'.forEach'과'보다 더 나쁜 관행을하게 생각합니다. .. in', 자바 스크립트에 관해서. 'hasOwnProperty' 검사는 속성이 Array 객체에 정의되어 있기 때문에 특정 예제에서 작동하지만'var x = [1,2];와 같은 문제는 다루지 않습니다. x.prop = 'a'; ' –

+0

왜 그것이 더 나빠진다고 생각하니? 최신 브라우저 만 지원하는 경우에는 forEach를 사용해야합니다. 모든 것이 가능합니다. node.js에서, 당신이 그것을 사용하지 않았다면 나는 당신을 물 것입니다. –

+0

@DavidHedlund 나는 동의하지 않는다. '.forEach'는 이제 _expected_ 연습이되었으므로 shim을 사용하여 기본적으로 지원하지 않는 브라우저에 shim을 추가해야합니다. 제대로 작성된 ES5 코드에서'.hasOwnProperty'는 거의 필요하지 않습니다. – Alnitak

관련 문제