>  기사  >  웹 프론트엔드  >  Javascript 연구 노트 - 객체(4): for in loop_basic 지식

Javascript 연구 노트 - 객체(4): for in loop_basic 지식

WBOY
WBOY원래의
2016-05-16 16:43:201174검색

첫 번째 예:

// Poisoning Object.prototype
Object.prototype.bar = 1;

var foo = {moo: 2};
for(var i in foo) {
 console.log(i); // prints both bar and moo
}

여기서 두 가지 점에 주의해야 합니다. 첫째, for in 루프는 false로 설정된 열거 가능 속성을 무시합니다. 예를 들어 배열의 길이 속성입니다. 두 번째는 for in이 전체 프로토타입 체인을 순회하므로 프로토타입 체인이 너무 길면 성능에 영향을 미칠 수 있다는 것입니다.

Enumerable은 매우 생소한 단어입니다. 사실 JavaScript에서는 그 그림자를 거의 찾을 수 없으며 실제로 저자가 Ruby에서 빌려온 것입니다. Enumerable을 생성하는 목적은 단독으로 사용하는 것이 아니라 "혼합"하여 사용하는 것입니다. Prototype의 많은 메소드는 Enumerable을 혼합하여 사용하므로 프로토타입의 초석이라고 할 수 있습니다. 여기서는 자세한 소개를 하지 않겠습니다. 자세한 내용은 - Enumerable을 참조하세요.
for in 루프 자체의 동작을 변경할 수 없기 때문에 "Javascript Learning Notes - Objects (3): hasOwnProperty를 통해 다른 방법을 사용하여 해당 속성을 필터링할 수 있습니다. 》우리는 hasOwnProperty 메소드가 이를 수행할 수 있다는 것을 알고 있습니다.

hasOwnProperty 필터 사용

이전 예를 계속 사용합니다.

// Poisoning Object.prototype
Object.prototype.bar = 1;

var foo = {moo: 2};
 for(var i in foo) {
 if (foo.hasOwnProperty(i)) {
  console.log(i);
 }
 }

이것이 유일한 올바른 작성 방법입니다. hasOwnProperty 메소드를 사용했기 때문에 이번에는 moo만 출력됩니다. hasOwnProperty 메소드를 적용할 수 없는 경우 Object.prototype 확장 시 오류가 발생합니다.
이제 많은 프레임워크가 Object.prototype에서 메서드를 확장하도록 선택하므로 이러한 프레임워크를 사용할 때 hasOwnProperty로 필터링되지 않은 루프에서 for를 사용하면 문제가 발생합니다.

요약

hasOwnProperty를 사용하여 속성을 필터링하는 좋은 습관을 기르는 것이 좋습니다. 네이티브 프로토타입 객체의 확장 여부에 관계없이 실행 환경에 대해 어떤 가정도 하지 마세요.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.