구문의 간단함 때문에 js 에서 일반 for 문 대신 for in 을 자주 써왔는데 이번에 황당한 경험. array 를 받아 처리하는데 이 배열에 들어있지 않은 엉뚱한 값이 마지막에 튀어 나와서 에러 발생. 원인 도무지 모르겠어서 일단 forEach 문으로 바꾸니 에러는 해결되었는데 그래도 이유 궁금해서 찾아보니, 가령
var arr = [1, 2, 3];
for (var x in arr){ console.log(arr[x]); }
기대한대로 실행됩니다, 그런데,
Array.prototype.foo = 1;
이렇게 한 줄 실행해주고 for in 다시 돌려보면 ... @_@
array 타입에 prototype 으로 뭔가 확장해놓은 상태라면 for in 에서 의도치 않은 결과를 얻을 수 있다는거죠. 이외에도 for in 은 오더링을 보장해주지 않는다하니 ....
결론 : for in 은 object literal 에만 사용하고 array 에는 사용 금지!