JSON.parse & JSON.stringify를 이용한 깊은 복사


[JSON 메서드를 이용해서 깊은 복사 안되는 경우]

Date() 객체

// Date()

const obj = { d: new Date() };
const copied = JSON.parse(JSON.stringify(obj));

// checker는 모든 입력값이 같다면 true 아니면 false 출력해주는 함수

checker(obj, copied); // 입력값이 같음에도 false

BigInt

// BigInt

JSON.stringify(BigInt(1));
~~~~~~~~~~~~~~
// Uncaught TypeError
// Do not know how to serialize a BigInt

함수

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/9f8b764d-353a-4914-b68c-e6600f2be802/Untitled.png

위 목록에 없는 경우

  1. 배열을 넘길 경우 — 해당 값을 null 로 치환한다.
  2. 객체를 넘길 경우 — 해당 { key: value } 를 모두 삭제한다. 왜냐하면 JSON.stringify 에는 두 번째 인자로 함수를 넘길 수 있는데, 이 함수의 반환값이 fasly 인 경우엔 해당 { key: value} 를 결과 값에 포함시키지 않는다. 마찬가지로, 객체를 넘겼는데 그 안에 함수나 undefined 과 같은 값이 value 로 들어있다면 입력 받은 값의 평가 과정에서 해당 값이 falsy 로 간주되어 결과에 포함되지 않는다.
  3. 단일 값으로 넘길 경우 — undefined 로 처리한다
  4. 그 외에 기타 경우 — 에러 발생 (대표적으로 BigInt )
JSON.stringify(function() {})     // undefined
JSON.stringify([function() {}])   // [null]
JSON.stringify({f: function() {}) // {}
JSON.stringify({f: () => {})      // {}
JSON.stringify({d: undefined})    // {}