深拷贝和浅拷贝都只针对引用数据类型浅拷贝:会对对象逐个成员依次拷贝,但只复制内存地址,而不复制对象本身,新旧对象成员还是共享同一内存深拷贝:会另外创建一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
1- 浅拷贝
1-1 数组中每项是简单数据类型,实现浅拷贝
var arr = [1,2,3]var sum = arrconsole.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 = nullvar 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))