JSON.parse & JSON.stringify를 이용한 깊은 복사
Object.prototype.toString.call
을 실행해서 변환
[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
함수
- 자바스크립트와 JSON 호환되는 데이터 모음에 함수는 없다
위 목록에 없는 경우
- 배열을 넘길 경우 — 해당 값을 null 로 치환한다.
- 객체를 넘길 경우 — 해당
{ key: value }
를 모두 삭제한다. 왜냐하면 JSON.stringify
에는 두 번째 인자로 함수를 넘길 수 있는데, 이 함수의 반환값이 fasly 인 경우엔 해당 { key: value}
를 결과 값에 포함시키지 않는다. 마찬가지로, 객체를 넘겼는데 그 안에 함수나 undefined
과 같은 값이 value 로 들어있다면 입력 받은 값의 평가 과정에서 해당 값이 falsy 로 간주되어 결과에 포함되지 않는다.
- 단일 값으로 넘길 경우 —
undefined
로 처리한다
- 그 외에 기타 경우 — 에러 발생 (대표적으로
BigInt
)
JSON.stringify(function() {}) // undefined
JSON.stringify([function() {}]) // [null]
JSON.stringify({f: function() {}) // {}
JSON.stringify({f: () => {}) // {}
JSON.stringify({d: undefined}) // {}