浅拷贝
1 | object.assign() |
不会拷贝对象的继承属性、不会拷贝对象的不可枚举属性、可以拷贝 Symbol 类型的属性
1 | let target = {}; |
还有 concat、slice、拓展运算符均可以实现浅拷贝。
手工实现浅拷贝:
1 | const shallowClone = (target) => { |
深拷贝
乞丐版:JSON.stringify()
存在的问题:(可以结合之前文章的手写 JSON.stringify() 看)
- 拷贝的对象的值中如果有函数、undefined、symbol 这几种类型,拷贝后整个键值对消失
- 拷贝后 Date 引用类型变为字符串(调用了 toJSON)
- 无法拷贝不可枚举的属性
- 无法拷贝对象的原型链
- 拷贝 RegExp 会变为空对象
- 对象中含有 NaN、Infinity,拷贝结果会变为 null
- 无法拷贝循环引用
手写深拷贝:
首先要了解一个方法:Object. getOwnPropertyDescriptors()
,这个方法用于获得属性的特性
1 | const person = { |
还有一个是 Reflect.ownKeys(),它返回一个由目标对象自身的属性键组成的数组。返回值等同于 Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target))
1 | const isComplexDataType = obj => ((typeof obj === 'object' || typeof obj === 'function') && obj !== null); |