주의사항
- 오브젝트의 키를 순회할 때 주의할 점은 딱 한가지.
for...in으로 객체를 순회할 때 hasOwnProperty를 사용하지 않으면 프로토타입 체인에 있는 모든 열거 가능한(enumerable) 프로퍼티까지 순회하게 된다.
부작용 예시
// 프로토타입에 프로퍼티 추가 (악의적이거나 실수로)
Object.prototype.injected = 'malicious';
const user = {
name: 'John',
age: 30
};
// hasOwnProperty 없이 순회
for (let key in user) {
console.log(key, user[key]);
}
// 출력:
// name John
// age 30
// injected malicious ⚠️ 예상치 못한 프로퍼티!
// hasOwnProperty 사용
for (let key in user) {
if (user.hasOwnProperty(key)) {
console.log(key, user[key]);
}
}
// 출력:
// name John
// age 30 ✅ 본연의 프로퍼티만!
안전한 방식들
[1] Object.keys() + for ~ of
const keys = Object.keys(obj);
for(const key in keys) {
// do something
}
Object.keys(obj).forEach((v) => {});
[2] for ~ in + hasOwnProperty
for(const key of obj) {
if(Object.hasOwnProperty(key){
// do something
}
}
[3] Object.entries() + for ~ of
for (let [key, value] of Object.entries(obj)) {
// do something
}