티스토리 뷰


발생일: 2013.03.09

문제:
지난 주 스터디에선 `JSON.stringify()` 에 대한 얘기가 나왔었다.

가끔 객체를 문자열로 바꾸다가 에러가 발생했던 경험이 있어서,
객체를 직렬화하는 경우 오류가 발생할 수 있으니 주의해야하고,
아마도 프로토타입을 순회하는 과정에서 발생하는 것 같다고 설명했었다.

다음 날, 스터디 멤버 중 한 분이 오류가 발생하는 예제 코드에 대한 질문을 하셨는데,
살펴보니 내가 잘못 설명한 부분이 있더라. =_=


해결책:

정확하게는, 프로토타입을 순회하는 과정에서 발생하는 게 아니라,
순환 참조로 인해 발생하는 경우가 많다.

예를 들어,
아래 코드는 TypeError: Converting circular structure to JSON 를 발생하게 된다.

  var a = [];
  a[0] = a;
  JSON.stringify(a);


위 코드는 좀 극단적인데,
실제로 객체를 만들다보면 순환 참조를 생성하는 경우가 종종 있다.

  var a = {};
  var b = {};
  a.b = b;
  b.a = a;
  JSON.stringify(a);


참, 그리고 `JSON.stringify()`를 할 때 프로토타입 속성은 직렬화되지 않는다.

  function A() {};
  A.prototype.foo = function () {}; // 프로토타입 속성
  JSON.stringify(new A()); //--> {};


당연하지만, 배열에 추가한 속성도 직렬화되지 않는다.

  var a = [1, 2, 3];
  a.foo = "bar";
  JSON.stringify(a); //--> "[1,2,3]"


JSON 객체의 직렬화에 대상은 ES5 스펙에도 정의되어 있고,
ownProperty 이면서, enumerable 한 것만 직렬화 대상이 된다.



참고:
- ECMAScript5 스펙의 JSON.stringify(): http://es5.github.com/#JO

JSON.stringify serializes to [[]]


반응형
댓글
공지사항