浅拷贝
object.assign
浅拷贝
不会拷贝对象的继承属性
不会拷贝对象的不可枚举属性
可以拷贝Symbol属性
扩展运算符
- 浅拷贝
concat拷贝数组
- 浅拷贝
- 只能拷贝数组
slice拷贝数组
- 浅拷贝
- 只能拷贝数组
手写一个浅拷贝
深拷贝
JSON.stringfy
拷贝的对象的值中如果有函数、undefined、symbol 这几种类型,经过 JSON.stringify 序列化之后的字符串中这个键值对会消失;
拷贝 Date 引用类型会变成字符串;
无法拷贝不可枚举的属性;
无法拷贝对象的原型链;
拷贝 RegExp 引用类型会变成空对象;
对象中含有 NaN、Infinity 以及 -Infinity,JSON 序列化的结果会变成 null;
无法拷贝对象的循环应用,即对象成环 (obj[key] = obj)。
深拷贝基础手写递归实现
- 不能拷贝不可枚举属性和Symbol类型
- 只针对普通引用类型做递归复制 (数组,正则,日期等 不能正确拷贝)
- 无法拷贝对象的循环应用,即对象成环 (obj[key] = obj)
深拷贝升级手写递归实现
利用Object的getOwnPropertyDescriptors方法可以获得对象的所有属性,以及对应的特性,顺便结合Object的create方法创建一个新对象,并继承传入对象的原型链 。利用WeakMap类型作为Hash表,因为WeakMap是弱引用类型,可以有效防止内存泄漏,作为检测循环引用很有帮助,如果存在循环,则引用直接返回WeakMap存储的值