什么是深拷贝,浅拷贝
浅拷贝只拷贝第一层
看下面的例子就更加清晰知道了
let book = {
name:"局外人",
types:{
t1:"中文版",
t2:"英文版"
}
}
let obj= {}
for(let i in book){
obj[i] = book[i]
}
book.name = "123"
book.types.t1 = "西班牙文"
console.log(obj,book);
这里的name是字符串类型属于基本数据类型,复制的话会创建另一个地址空间,所以改变之后两个对象的值不一样,而types属于引用类型了,这么复制只复制了指针改变之后两个的值都 改变成了西班牙文了。综上整个过程是一个浅拷贝
除此之外浅拷贝还有
var obj = Object.assign({},book)
Object.assign(target,…source) ,target目标对象,book是原对象,这里目标对象为空是为了防止assign改变目标对象
深拷贝有哪些方式
用JSON下的方法
let deepClone = function (obj) {
let result = JSON.parse( JSON.stringify(obj););
//先将对象转换为json字符串形式
//将转换而来的字符串转换为原生js对象
};
但是这种方法有一点点的小缺陷,就是如多被拷贝对象里面有函数,那么函数不能被拷贝
用递归实现
function deepClone(obj = {}){
if(typeof obj !=='object' || obj ==null){
// obj 是null,或者不是对象和数据,直接返回
return obj
}
//
let result
if(obj instanceof Array){
result = []
}else{
result = {}
}
for(let key in obj){
// 保证key不是原型的属性
if(obj.hasOwnProperty(key)){
result[key] = deepClone(obj[key])
}
}
return result
}