🎀个人主页:努力学习前端知识的小羊
感谢你们的支持:收藏🎄 点赞🍬 加关注🪐
在练习算法时,遇到了深拷贝与浅拷贝的问题,于是就了解了一番
算法地址
算法题解
浅拷贝
const _shallowClone = target => { // 补全代码 let copyRes=Array.isArray(target)?[]:{} for(let key in target){ copyRes[key]=target[key] } return copyRes }
深拷贝
const _completeDeepClone = (target, map = new Map()) => { // 补全代码 if(target === null) return target if(typeof target !== 'object') return target const constructor = target.constructor if(/^(Function|RegExp|Date|Map|Set)$/i.test(constructor.name)) return new constructor(target) //进行深拷贝,不能传递地址 if(map.get(target)) return map.get(target) //已经遍历到了,直接返回结果 map.set(target, true) //还未遍历,设置为true const cloneTarget = Array.isArray(target) ? [] : {} for(prop in target) { //开始遍历 if(target.hasOwnProperty(prop)) { cloneTarget[prop] = _completeDeepClone(target[prop], map) } } return cloneTarget }
分析深拷贝与浅拷贝
浅拷贝
浅拷贝:自己创建一个新的对象,来接受你要重新复制或引用的对象值。如果对象属性是基本的数据类型,复制的就是基本类型的值给新对象;但如果属性是引用数据类型,复制的就是内存中的地址,如果其中一个对象改变了这个内存中的地址,肯定会影响到另一个对象。
实现浅拷贝,可以直接通过Object.assign方法实现
const obj = {}; const source = { name: 'nordon', info: { age: 18 } }; Object.assign(obj, source);
注:该方法的第一个参数是拷贝的目标对象,后面的参数是拷贝的来源对象(也可以是多个来源)。
实现浅拷贝,也可以通过扩展运算符来实现
const source = { name: 'nordon', info: { age: 18 } }; const obj = {...source};
深拷贝
深拷贝作用在引用类型上!例如:Object,Array
深拷贝不会拷贝引用类型的引用,而是将引用类型的值全部拷贝一份,形成一个新的引用类型,这样就不会发生引用错乱的问题,使得我们可以多次使用同样的数据,而不用担心数据之间会起冲突。
实现深拷贝,可以通过for in 实现
function deepCopy1(obj) { let o = {} for(let key in obj) { o[key] = obj[key] } return o } let obj = { a:1, b: undefined, c:function() {}, deepCopy1(obj)
实现深拷贝还可以通过递归实现
function deepClone1(obj) { //判断拷贝的要进行深拷贝的是数组还是对象,是数组的话进行数组拷贝,对象的话进行对象拷贝 var objClone = Array.isArray(obj) ? [] : {}; //进行深拷贝的不能为空,并且是对象或者是 if (obj && typeof obj === "object") { for (key in obj) { if (obj.hasOwnProperty(key)) { if (obj[key] && typeof obj[key] === "object") { objClone[key] = deepClone1(obj[key]); } else { objClone[key] = obj[key]; } } } } return objClone; }
希望对朋友们有所帮助,如有更好的见解,欢迎评论留言哦,期待你们的支持✨✨✨