正规网站建设费用,傻瓜式做网站软件,58同城赶集网,网站设计公司 长沙浅拷贝#xff1a;拷贝的是引用类型数据的第一层#xff1a;数组或者对象#xff1a;的地址
深拷贝#xff1a;通过不断的递归进行拷贝 原理普及#xff1a;在js中引用类型的变量储存的时候引用类型数据的地址#xff0c;因此当地址被重新赋值新的对象的时候#xff…浅拷贝拷贝的是引用类型数据的第一层数组或者对象的地址
深拷贝通过不断的递归进行拷贝 原理普及在js中引用类型的变量储存的时候引用类型数据的地址因此当地址被重新赋值新的对象的时候修改新的对象实际上就等于修改了原来的对象。因此浅拷贝的出现就是开辟一个新的地址去拷贝原来对象的数据这样修改的时候 就不会影响到原来的数据了。
但是因为浅拷贝只能深究到第一层因此就有了深拷贝的出现。
浅拷贝 script// 浅拷贝 首先要知道深浅拷贝只针对引用数据类型// 浅拷贝拷贝的是引用类型的里面第一层的地址 储存空间中有栈和堆 栈存放地址 堆存放内容// 实现浅拷贝有两种方式 第一种类似于解构const obj {name:ddd,age:18,hobby:basketball,body:{foot:foot,head:head}}const o {...obj}console.log(o);console.log(obj);o.age 20console.log(o);console.log(obj);// 第二种方式实现浅拷贝 Object.assgin() const obj2 {name:ddd,age:18,hobby:basketball,body:{foot:foot,head:head}}const o2 {}Object.assign(o2,obj2)console.log(o2);console.log(obj2);
// 如果是数组 两种方法 对应就是[...xxx]和.concat()/script
深拷贝 script// const obj {// name:ddd,// age:20,// hobby:[项目1,项目2]// }// const o {// }// function deepCopy (newObj,oldObj) {// // k是属性名 oldObj[k]属性值// for(let k in oldObj){// // 处理数组的问题// if(oldObj[k] instanceof Array){// newObj[k] []// // 这里有点难理解 newObj[k]就是hobby数组 然后对这个数组进行操作// deepCopy (newObj[k],oldObj[k])// }else{// newObj[k] oldObj[k]// }// }// }// deepCopy(o,obj) //o是新对象 obj是旧对象// console.log(o);// // 如果我修改了新对象里面的数组或者对象 新旧同时也会被修改 所以没有达到拷贝的效果 引用类型还是把地址拿来了// console.log(obj);// 第二种方式实现深拷贝// 然后引入// script srcxxxxscript// const obj {// name:ddd,// age:20,// hobby:[项目1,项目2]// }// const o _.cloneDeep(obj)// console.log(o)//第三种方式深拷贝 JSONconst obj {name:ddd,age:20,hobby:[项目1,项目2]}// 把对象转换为json字符串JSON.stringify(obj)console.log(JSON.stringify(obj));// JSON.parse(JSON.stringify(obj)) 又把json字符串转换为了对象 但是这个时候的对象 等于在空间有开辟了一个新的地址 const o JSON.parse(JSON.stringify(obj))//完美实现深拷贝console.log(o);o.hobby.push(dddddd)console.log(o);console.log(obj);/script