hasOwnProperty를 사용하여 필터링
요약
in 연산자와 마찬가지로 for in 루프도 객체 속성을 찾을 때 프로토타입 체인의 모든 속성을 순회합니다.
// 修改 Object.prototype Object.prototype.bar = 1; var foo = {moo: 2}; for(var i in foo) { console.log(i); // 输出两个属性:bar 和 moo }
for 자체의 동작을 변경하는 것은 불가능하므로 루프 본문에 표시되기를 원하지 않는 속성을 필터링해야 합니다. 이는 개체의 hasOwnProperty 함수를 통해 수행할 수 있습니다. .prototype 프로토타입.
참고: for in 루프는 열거 가능 항목이 false로 설정된 속성(예: 배열의 길이 속성)을 순회하지 않습니다.
hasOwnProperty를 사용하여
// foo 变量是上例中的 for(var i in foo) { if (foo.hasOwnProperty(i)) { console.log(i); } }
필터링하려면 이 버전의 코드가 코드를 작성하는 유일한 올바른 방법입니다. hasOwnProperty를 사용했기 때문에 이번에는 moo만 출력됩니다. hasOwnProperty를 사용하지 않으면 기본 객체 프로토타입(예: Object.prototype)이 확장될 때 이 코드가 중단될 수 있습니다.
널리 사용되는 클래스 라이브러리 Prototype은 기본 JavaScript 객체를 확장합니다. 따라서 이 클래스 라이브러리가 페이지에 포함되면 hasOwnProperty 필터링을 사용하지 않는 for in 루프에서 필연적으로 문제가 발생할 수 있습니다.
참고: for in은 항상 전체 프로토타입 체인을 순회하므로 객체의 상속 수준이 너무 깊으면 성능에 영향을 미칩니다.
요약
항상 hasOwnProperty를 사용하고, 코드가 실행되는 환경에 대해 어떠한 가정도 하지 않으며, 네이티브 객체가 확장되었는지 여부도 가정하지 않는 것이 좋습니다.
위는 JavaScript 고급 시리즈 - for in loop의 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(m.sbmmt.com)를 참고해주세요!