let obj = {
a: 'a',
b: 'b',
c: {
c1: 'c1',
c2: 'c2'
}
}
function copy(object) {
let _obj = {}
for (const key of Object.keys(obj)) {
_obj[key] = object[key]
}
return _obj
}
let temp = copy(obj)
temp.c.c1 = 'test'
console.log(obj.c.c1)//test
console.log(temp.c.c1)//test
我们拷贝的对象中的属性改变,原对象中的属性也会改变。
实现深拷贝
JSON.parse(JSON.stringify())
此方法可以实现深拷贝,但是有缺点:
丢失原型,会直接指向Object
循环引用会报错
深拷贝的对象有限
function A() {
this.a = 'A'
}
A.prototype.YBF = function (params) {}
let a = new A()
let aa = JSON.parse(JSON.stringify(a))
let obj1 = { name: 'obj1' }
let obj2 = { name: 'obj2' }
obj1.a = obj2
obj2.a = obj1
let obj3 = {
b: obj1
}
JSON.parse(JSON.stringify(obj3))
let list = [1, 1, 1, 1]
let set = new Set(list)
let rex = new RegExp('adb')
let map = new Map([{ 1: 1 }, { 2: 2 }])
let a = {
list: list,
set: set,
rex: rex,
map: map
}
let aa = JSON.parse(JSON.stringify(a))
深拷贝
深拷贝的原因
对引用类型(Object)进行拷贝时,不会重新开辟新的地址而是直接复制地址。
例子
我们拷贝的对象中的属性改变,原对象中的属性也会改变。
实现深拷贝
JSON.parse(JSON.stringify())
此方法可以实现深拷贝,但是有缺点:
试了下就数组可以
代码实现
isType
:来判断参数的的类型hasClone来存储已经创建的地址,避免循环
使用递归来层层进行拷贝,完成深拷贝
参考
面试官:请你实现一个深克隆
JS深拷贝总结