定义:拷贝后新对象的属性和原对象中的属性不会关联,但是方法都指向同一个地址
es6剩余参数解构
let b ={...obj}
Object.assign(复制方, 被复制方) 返回枚举后的新对象
let b = Object.assign({}, obj);slice()切割
let b = obj.slice();
深克隆
定义:
拷贝一个新对象出来,但是新对象的地址和原对象的地址不一样
任意一方修改数据不会影响另一方,只是刚开始拷贝过去属性和方法长得一样
1、递归(原生) 面试用的
functionDeepclone(obj){// 1、传入的是数组还是对象let deepObj = Array.isArray(obj)?[]:{};// 2、判断obj是否为基本数据类型 objectif(obj &&typeof obj ==='object'){// 3、for in 遍历对象中的每个属性for(key in obj){// 4、判断 obj 中是否有这个key属性if(obj.hasOwnProperty(key)){// 5、判断obj中的key是否都为基本数据类型 objectif(obj[key]&&typeof obj[key]==='object'){// 6、是的话递归将每个key插入到 deepObj 中
deepObj[key]=Deepclone(obj[key])}else{// 7、不是的话等于他原来的样子
deepObj[key]= obj[key]}}}}// 8、最后把结果返回出去return deepObj
}let obj ={ n:1};let b =Deepclone(obj);// b = { n: 1 }2、插件lodash 开发用这个,健壮性强
下载 npm i lodash
const _ =require('lodash');let b = _.cloneDeep(obj);// { n: 1 }3、JSON.parse和JSON.Stringify 随便
let b =JSON.parse(JSON.Stringify(obj));// { n: 1 }