🎀个人主页:努力学习前端知识的小羊
感谢你们的支持:收藏🎄 点赞🍬 加关注🪐
在练习算法时,遇到了深拷贝与浅拷贝的问题,于是就了解了一番
算法地址
算法题解
浅拷贝
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;
}
希望对朋友们有所帮助,如有更好的见解,欢迎评论留言哦,期待你们的支持✨✨✨