手写深拷贝

方法一:

const deepCopy = (obj) => {
		if (obj === null || obj === undefined) {
			return obj; // 或者可以根据需要返回其他值,如null  
		}
		let newObj = Array.isArray(obj) ? [] : {};
		for (let key in obj) {
			if (obj.hasOwnProperty(key)) { // 确保只复制对象自身的属性 
				if (obj[key] instanceof Array) {
					newObj[key] = deepCopy(obj[key])
				} else if (obj[key] instanceof Object && obj[key] !== null) {
					newObj[key] = deepCopy(obj[key])
				} else {
					newObj[key] = obj[key]
				}
			}
		}
		// 如果需要保留原型链,可以添加以下代码  
		// Object.setPrototypeOf(newObj, Object.getPrototypeOf(obj));
		console.log(newObj)
		return newObj
	}



let data = {
    name: '小明',
	age: 18,
	hobby: [{
		id: 1,
		text: 'aaa'
	},
	{
		id: 2,
		text: 'bbb'
	}]
}

deepCopy(data)




方法二:

const deepCopy = (newObj,obj) => {
		for(let key in obj) {
			if (obj[key] instanceof Array) {
				newObj[key] = []
				deepCopy(newObj[key],obj[key])
			} else if (obj[key] instanceof Object) {
				newObj[key] = {}
				deepCopy(newObj[key],obj[key])
			} else{
				newObj[key] = obj[key]
			}
		}
		console.log(newObj)
	}

let data = {
    name: '小明',
	age: 18,
	hobby: [{
		id: 1,
		text: 'aaa'
	},
	{
		id: 2,
		text: 'bbb'
	}]
}

deepCopy({},data)

方法三:

const deepCopy = (target) => {
	    if (typeof target === 'object') {
	    	// 此处要先判断是否是数组,因为数组也属于对象
	        let cloneTarget = Array.isArray(target) ? [] : {};
	        for (const key in target) {  // key 是属性名,target[key]是属性值
	            cloneTarget[key] = deepCopy(target[key]); // cloneTarget[key] 是创建属性名
	        }
					console.log(cloneTarget,'cloneTarget====')
	        return cloneTarget;
	    } else {
	        return target;
	    }
	};

let data = {
    name: '小明',
	age: 18,
	hobby: [{
		id: 1,
		text: 'aaa'
	},
	{
		id: 2,
		text: 'bbb'
	}]
}

deepCopy(data)


方法四:

// 深拷贝(相对完整版但也有很多特殊类型没包含,如: Blob,file,ArrayBuffer和TypedArray)
	function deepCopy(obj, hash = new WeakMap()) {
	  // 如果obj是原始类型,直接返回
	  if (obj === null || typeof obj !== 'object') {
	    return obj;
	  }

	  // 如果obj已经在hash中,说明之前已经拷贝过,直接返回其拷贝的副本
	  if (hash.has(obj)) {
	    return hash.get(obj);
	  }
	  // 根据obj的类型创建一个新的实例
	  let cloneObj;
	  if (obj instanceof Array) {
	    cloneObj = [];
	  } else if (obj instanceof Date) {
	    cloneObj = new Date(obj);
	  } else if (obj instanceof RegExp) {
	    cloneObj = new RegExp(obj);
	  } else {
	    cloneObj = new obj.constructor;
	  }
	  // 将新对象存入hash,避免无限递归
	  hash.set(obj, cloneObj);
	  // 递归处理obj的所有属性
	  for (let key in obj) {
	    if (obj.hasOwnProperty(key)) {
	      cloneObj[key] = deepCopy(obj[key], hash);
	    }
	  }
		console.log(cloneObj,'clone========')
	  return cloneObj;
	}


let data = {
    name: '小明',
	age: 18,
	hobby: [{
		id: 1,
		text: 'aaa'
	},
	{
		id: 2,
		text: 'bbb'
	}]
}

deepCopy(data)

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值