- 浅拷贝: 以赋值的形式拷贝引用对象, 仍指向同一个地址, 修改时原对象也会受到影响
- 深拷贝: 完全拷贝一个新对象, 修改时原对象不再受到任何影响
let obj = {
id: 1,
name: 'andy',
msg: {
age: 18
}
}
//先在这里写一个对象,然后下面分别来实现深浅拷贝。
浅拷贝
let newObj = Object.assign({}, obj)
let newObj2 = { ...obj }
Object.assign()
方法将所有可枚举(Object.propertyIsEnumerable()返回true(Object.hasOwnProperty()返回true)属性从一个或多个源对象复制到目标对象,返回修改后的对象。通过Object.assign()
方法可以实现浅拷贝。
深拷贝
递归深拷贝
function deepCopy(oldObj) {
// 过滤特殊情况
if (oldObj === null) return null
if (typeof oldObj !== 'object') return oldObj
if (oldObj instanceof RegExp) {
return new RegExp(oldObj)
}
if (oldObj instanceof Date) {
return new Date(oldObj)
}
// 不直接创建空对象的目的: 克隆的结果和之前保持相同所属类
let newObj = new oldObj.constructor
for (let k in oldObj) {
if (oldObj.hasOwnProperty(k)) {
newObj[k] = deepCopy(oldObj[k])
}
}
return newObj
}
let newObj3 = deepCopy(obj)
JSON深拷贝
function deepClone(oldObj) {
return JSON.parse(JSON.stringify(oldObj))
}
JSON实现深拷贝也是比较常见的,但是这样拷贝会有一些弊端,拷贝的对象只能是Number,String,Boolean,Array,扁平对象,即那些能够被JSON直接表示的数据结构。