在日常开发中,当想用某个变量去获取另外一个对象变量数据时,最直接的方法是:
let obj2 = obj1
由于对象是引用类型,当改变obj2中某属性的值时,obj1中的属性也会随着改变,有时候我们并不希望出现这种情况。那么,我们可以采取以下方法:
let obj2 = Object.assign({}, obj1)
这时,当改变obj2中某属性时,obj1的对应属性并不会随之变化,很多情况下是这样,但当obj1内部的属性又是对象时,这样的方法还是会出现在obj2中改变某属性,obj1中的属性也随之改变的情况。这样的拷贝,我们称之为浅拷贝。要实现深拷贝,简便的方法是借用JSON.parse和JSON.stringify来实现:
let obj2 = JSON.parse(JSON.stringify(obj1))
这样,obj2与obj1已经没有半毛钱关系了,随意改变obj2中的属性值,obj1都不会有任何改变,这样我们称之为深拷贝。但是利用JSON的方法,会把function给忽略掉,也就是说,当数据中有方法时,方法并不会被拷贝。但是,我们真的还想把方法也给拷贝,那只有自己写方法了。我自己写的一个方法如下:
let cloneObject = (obj) => {
let object
if(obj && typeof obj === 'object') {
if(obj instanceof Array) {
object = []
for(let i = 0; i < obj.length; i++) {
if(obj[i] && typeof obj[i] === 'object') {
object.push(cloneObject(obj[i]))
}else{
object.push(obj[i])
}
}
}else{
object = {}
for(let key in obj) {
let value = obj[key]
if(typeof value === 'object') {
object[key] = cloneObject(value)
}else {
object[key] = value
}
}
}
}
return object
}
这样的方法传入数组或都对象就能实现对象深拷贝
网友评论