二者的区别
浅拷贝只是将被克隆对象的引用值赋值于新对象,如果改动引用值,二者都会受影响而深拷贝是将值拷贝过来,改动不会影响。
浅拷贝方法
普通for循环
var a = {
name:'zs',
hobby: {
sport:{
swim:true
}
}
}
var obj = {}
for (let key in a) {
if (a.hasOwnProperty(key)) {
obj[key] = a[key]
}
}
console.log(obj)
只要改动obj中hobby的值,那么a对象中的也会改变,因为他们指向同一个指针
ES6展开运算符
var a = {
name:'zs',
hobby: {
sport:{
swim:true
}
}
}
var obj = {...a}
Object.assign方法
var a = {
name:'zs',
hobby: {
sport:{
swim:true
}
}
}
var obj = Object.assign(a)
深拷贝方法
Json.parse(JSON.stringify(obj)) 这是最直接的方法,弊端是遇到正则,函数,date对象等类型的值会转换错误 适用于一般对象数组类型的拷贝
递归法
function deepClone(obj
,newObj
) {
let target
= newObj
|| {}
if(!obj
|| typeof obj
!== "object"){
return obj
}
for (let key
in obj
) {
if (obj
[key
] instanceof Object) {
console
.log(key
);
target
[key
] = deepClone(obj
[key
], {})
} else{
target
[key
] = obj
[key
]
}
}
return target
}
递归结束条件如果传递对象为空或者类型不是对象类型
for循环遍历对象
,如果属性值依然是引用类型,再次调用函数,否则直接赋值于新对象