//第一种案例 深拷贝
//实现深拷贝原理:堆栈开辟新内存空间,实现深拷贝
let obj = {
name:'111',
age:22,
f:{
a:3,
b:4,
c:{
d:5
}
}
}
let newobj = JSON.parse(JSON.stringify(obj))
newobj.f.c.d = '222'
console.log(obj)//{"name":"111","age":22,"f":{"a":3,"b":4,"c":{"d":5}}}
console.log(newobj)//{"name":"111","age":22,"f":{"a":3,"b":4,"c":{"d":"222"}}}
// 总结:深拷贝即创建新的内存地址保存值(互不影响)
//第二种案例 浅拷贝
//对象里面第一层是基本类型进行深拷贝,对象引用类型进行浅拷贝
let obj = {
name:'111',
age:22,
f:{
a:3,
b:4,
c:{
d:5
}
}
}
let newobj = Object.assign({},obj)
obj.age = 3333
newobj.age = 3111
newobj.f.c.d = 9
obj.f.c.d = 8888
newobj.f.a = 99999999
console.log(JSON.stringify(obj))
console.log(JSON.stringify(newobj))
{"name":"111","age":3333,"f":{"a":99999999,"b":4,"c":{"d":8888}}}
{"name":"111","age":3111,"f":{"a":99999999,"b":4,"c":{"d":8888}}}
// 总结:
//由这个数据可见 第一层是深拷贝 对象引用类型进行的浅拷贝
缺点:
如果obj里面有时间对象,则JSON.stringify后再JSON.parse的结果,时间将只是字符串的形式。而不是时间对象;
如果obj里有RegExp、Error对象,则序列化的结果将只得到空对象;
如果obj里有function,Symbol 类型,undefined,则序列化的结果会把函数或 undefined丢失;
如果obj里有NaN、Infinity和-Infinity,则序列化的结果会变成null
JSON.stringify()只能序列化对象的可枚举的自有属性,例如 如果obj中的对象是有构造函数生成的, 则使用JSON.parse(JSON.stringify(obj))深拷贝后,会丢弃对象的constructor;