며칠 전에
JSON 라이브러리(Javascript Object Notation)의
새 버전이 나왔습니다.
여러 사람들이 환영하는 분위기 입니다. 가장 큰 이유는 기존 버전과 달리 더이상 Object.prototype에 JSON 관련 메서드를 추가하지 않는다는 점입니다. Object.prototype에 뭔가를 추가했을 때의 가장 큰 문제는 모든 객체에 대한 for ... in 루프에서 추가된 속성들이 열거(enumerate)된다는 점이죠.
물론 모든 for ... in 루프에서 다음과 같이 방어적 코딩을 하면 문제될 것은 없습니다만:
for (key in object) if (object.hasOwnProperty(key)) {
// do something here
}
이 컨벤션이 그리 널리 사용되지 않는다는게 문제죠.
Prototype.js 같은 유명한 라이브러리에서 JSON 관련 코드를 다시 만든 이유도 바로 이것입니다. Prototype.js 에서는 Object.prototype을 건드리지 말 것을 강력하게 주장하고 있습니다.
Crockford가 애초에 Object.prototype을 확장하는 방식으로 JSON 라이브러리를 구현한 이유는 바로, JSON 관련 메서드가 다음 버전의 자바스크립트 스팩에 포함되길 원했기 때문입니다.
JSON2가 더 이상 Object.prototype을 건드리지 않도록 바뀐 이유는 어쩌면 현재 자바스크립트 표준(ECMAScript 3rd edition)의 개정판인 자바스크립트 2(ECMAScript 4th edition)에
이미 그의 의견이 반영되었기 때문일지도 모르겠습니다.
(은근슬쩍 Javascript 2 얘기로 넘어갑니다)
그렇다고 해서 Crockford가 ECMAScript 4th edition을 좋아한다는 것은 아닙니다. 사실 그는 ECMAScript 4th edition (final draft)의
무지막지한 변화들(PDF)에 반대하고 있죠. 그가 생각하는 자바스크립트의 가장 큰 장점 중 하나는 1999년(3rd edition) 이후 언어 스팩에 어떠한 변화도 없었다는 사실이니까요. 한편, Javascript의 창시자인 Brendan은 Crockford가 뒤에서 4th edition 험담을 하고 다니는 걸
별로 달가워하지 않는 것 같습니다.
저도 final draft를 한번 훑어 읽어봤는데... 솔직한 느낌은
- 이런 저런 언어들에서 좋다고 하는 것들은 다 넣고
- 양념으로 실험적인 특징들 몇 개 추가
- 그러면서도 여전히 자바스크립트로 남아 있기 위해 물려받은 유산(legacy)들을 가진
그런 언어가 됐다는 느낌입니다. 어떤 이는 "
more like Java but better"라고 "긍정적으로" 표현하고 있지만, 또 다른 어떤 이는 그 표현이 "
worse but better"로 들린다고 하는군요 ㅎㅎ 저도 사실 약간 그렇게 들립니다.
뭐 그래도 스팩 상에 문제 없고, 스팩대로 구현만 깔끔하게 잘 나와준다면(
이런 식은 곤란), 쓰는 사람이 알아서 잘 골라쓰면 되는 것이긴 하니까요.