← Back to NOTES 🌰
← Effective JavaScript 🤿
← 아이템 47 - Object.prototype에 열거 가능한 프로퍼티를 절대 추가하지 마라
핵심 요약
for...in 루프로 객체를 열거하는 동안 그 객체에 프로퍼티를 추가하거나 삭제하면 예측할 수 없는 동작이 발생한다. ECMAScript 명세는 열거 중 추가된 프로퍼티가 현재 열거에 포함될 것을 보장하지 않으며, 삭제된 프로퍼티의 처리도 구현에 따라 다르다. 열거 중 객체 수정이 필요하다면 while 루프나 일반 for 루프를 사용하거나, 수정할 항목을 별도로 수집한 후 나중에 처리하라.
자세한 내용
for...in 루프의 불확실성
- 명세의 모호함: ECMAScript 표준에서 열거 중 수정에 대한 동작을 명확히 정의하지 않음
- 구현별 차이: 브라우저나 JavaScript 엔진마다 다른 동작
- 비결정적 동작: 같은 코드라도 실행할 때마다 다른 결과 가능
- 디버깅 어려움: 간헐적으로 발생하는 버그로 인한 문제
객체 수정의 위험 시나리오
- 프로퍼티 추가: 새로 추가된 프로퍼티가 열거에 포함될지 불분명
- 프로퍼티 삭제: 삭제된 프로퍼티가 이미 열거되었는지 확인 어려움
- 무한 루프: 열거 중 프로퍼티를 계속 추가하면 무한 루프 위험
- 데이터 불일치: 수정과 열거가 동시에 일어나면서 일관성 깨짐
안전한 대안
- 사전 수집: 열거할 키를 미리 배열로 수집 후 처리
- while 루프: 명시적인 제어 구조로 안전한 반복
- Set/Map 사용: 수정에 안전한 ES6 컬렉션 활용