그동안은 객체 프로퍼티를 나열할 때 for … in 을 주로 사용했습니다.
문자열 프로퍼티가 몇 개 있고 심볼 프로퍼티가 하나 있는 객체가 있다고 합시다.
const SYM = Symbol();
const o = { a: 1, b: 2, c: 3, [SYM]: 4 };
for (let prop in o) {
if (!o.hasOwnProperty(prop)) continue;
console.log(`${prop}: ${o[prop]}`);
}
상당히 단순해 보입니다만, hasOwnProperty 가 무슨 의미인지 궁금한 독자도 있을 겁니다.
hasOwnProperty 는 이 장 후반에 알게 될 상속된 프로퍼티가 for … in 에 나타날 위험을 제거하기 위해 사용합니다.
이 예제에서는 생략하더라도 아무 차이도 없습니다.
하지만 다른 타입의 객체, 특히 다른 사람이 만든 객체의 프로퍼티를 나열하다 보면 예상치 못한 상황이 생길 수 있으므로 hasOwnProperty 를 쓰는 습관을 들이길 권합니다.
hasOwnProperty가 왜 중요한지, 생략해도 안전할 때는 언제인지는 곧 알게 됩니다.
for … in 루프에는 키가 심볼인 프로퍼티는 포함되지 않습니다.
CAUTION_
for … in 을 배열에 사용할 수도 있겠지만, 그리 좋은 생각은 아닙니다.
배열에는 일반적인 for 루프나 forEach를 사용하십시오.