JSON.parse(JSON.stringify(obj))实现深拷贝的一些问题
JSON.parse(JSON.stringify(obj))可以实现深拷贝,它将一个对象序列化成一个json字符串再反序列成一个js对象。但会出现一些问题。
- 当json里面有时间对象时,序列化结果中会将时间对象转换成为字符串的形式;
const obj = {
a:1,
b:new Date()
}
console.log(obj) //{a: 1, b: Sun Oct 31 2021 15:27:38 GMT+0800 (中国标准时间)}
const newObj = JSON.parse(JSON.stringify(obj));
console.log(newObj) //{a: 1, b: '2021-10-31T07:27:38.968Z'}
- 当json里有RegExp、Error对象时,序列化的结果将只得到一个空对象;
const obj = {
a:1,
b:new RegExp('\\d+'),
c:new Error('1')
}
console.log(obj) //{a: 1, b: /\d+/, c: Error: 1 at http://127.0.0.1:5500/01.html:107:11}
const newObj = JSON.parse(JSON.stringify(obj));
console.log(newObj) //{a: 1, b: {}, c: {}}
- 当json里有 function,undefined时,序列化的结果中function,undefined 会丢失
const obj = {
a:1,
b:function(){},
c:undefined
}
console.log(obj) //{a: 1, c: undefined, b: ƒ}
const newObj = JSON.parse(JSON.stringify(obj));
console.log(newObj) //{a: 1}
- 当json里有NaN、Infinity和-Infinity时,序列化结果后得到的为一个null值;
const obj = {
a:1,
b:NaN,
c:Infinity,
d:-Infinity
}
console.log(obj) //{a: 1, b: NaN, c: Infinity, d: -Infinity}
const newObj = JSON.parse(JSON.stringify(obj));
console.log(newObj) //{a: 1, b: null, c: null, d: null}
- 当json里有对象是由构造函数生成的时候,序列化的结果会丢弃该对象的 constructor;
function Person(){}
const obj = {
a:1,
b:new Person()
}
console.log(obj)
const newObj = JSON.parse(JSON.stringify(obj));
console.log(newObj)
- 当对象中有在内存中的循环引用时,该方法将会报错。
const obj1 = {}
const obj2 = {}
obj1.a = obj2
obj2.b = obj1
console.log(obj1)
const newObj = JSON.parse(JSON.stringify(obj1));
console.log(newObj)