JSON.stringify()是目前前端开发过程中最常用的深拷贝方式,
原理是把有个对象序列化成为一个 JSON 字符串,将对象的内容转换成字符串的形式再保存到磁盘上,
再用 JSON.parse()反序列化将 JSON 字符串变成一个新的对象
1 let obj1 = { 2 a: 1, 3 b: [1, 2, 3], 4 }; 5
6 let str = JSON.stringify(obj1); 7 let obj2 = JSON.parse(str); 8 console.log(obj2); //{ a: 1, b: [ 1, 2, 3 ] }
9
10 //修改obj1
11 obj1.a = 2; 12 obj1.b.push(4); 13 console.log(obj1); //{ a: 2, b: [ 1, 2, 3, 4 ] }
14 console.log(obj2); //{ a: 1, b: [ 1, 2, 3 ] }
通过 JSON.stringify 实现深拷贝有几点要注意
- 拷贝的对象的值中如果有函数,undefined,symbol 则经过 JSON.stringify()序列化后的 JSON 字符串中这个键值对会消失
- 无法拷贝不可枚举的属性,无法拷贝对象的原型链
- 拷贝 Date 引用类型会变成字符串
- 拷贝 RegExp 引用类型会变成空对象
- 对象中含有 NaN、Infinity 和-Infinity,则序列化的结果会变成 null
- 无法拷贝对象的循环应用(即 obj[key] = obj)
学习记录