深拷贝和浅拷贝都只针对引用数据类型
浅拷贝:会对对象逐个成员依次拷贝,但只复制内存地址,而不复制对象本身,新旧对象成员还是共享同一内存
深拷贝:会另外创建一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
1- 浅拷贝
1-1 数组中每项是简单数据类型,实现浅拷贝
var arr = [1,2,3]
var sum = arr
console.log(sum); // [1,2,3]
arr.push(4)
console.log(sum); // [1,2,3,4]
1-2 数组中每项是复杂数据类型 ,实现浅拷贝
var arr = [{name:"zheng"},{name:"zhang"},{name:"li"}]
var res = [...arr]
res[0].name="huang" // arr变了
res.push({name:"vue"})
console.log(arr) // [{name:"huang"},{name:"zhang"},{name:"li"}]
2- 深拷贝
2-1 每项为简单数据类型(实现深拷贝)
1- 数组里每项是简单数据类型,实现深拷贝
/* 数组里面 每一项是基本数据类型的 是深拷贝 */
var arr = [1,2,3]
var sum = [...arr]
console.log(sum); //[1,2,3]
arr.push(4)
console.log(sum); // [1,2,3]
var arr = [1,2,3]
var sum = [].concat(arr)
console.log(sum); // [1,2,3]
arr.push(4)
console.log(sum); //[1,2,3]
var arr = [1,2,3]
var sum = arr.slice(0)
console.log(sum); // [1,2,3]
arr.push(4)
console.log(sum); // [1,2,3]
2- 对象的属性是简单数据类型,实现深拷贝
# {...obj}
# Object.assign({},obj)
var obj = {name:"cheng",age:18}
// var a = {...obj}
var a = Object.assign({},obj)
obj.id = 100;
console.log(a) // {name:"cheng",age:18}
2-2 每项为复杂数据类型(array+object)
// 遇到复杂类型(array+object)如何实现深拷贝
// var obj = null
var obj = {name:{name:"cheng"}}
function deepClone(obj){
// 1. 能够识别数组和对象了
let result;
if(obj instanceof Array || obj instanceof Object){
// 2.对拷贝的值做初始值的设定
if(obj instanceof Array){
result = []
}else if(typeof obj == "object"){
result={}
}
// 3.需要将obj克隆到result中
for(let key in obj){
result[key] = deepClone(obj[key])
}
return result
}else{
return obj
}
}
deepClone(obj)
console.log(deepClone(obj))