关于数组和对象的深拷贝方法

参考了阮一峰的深拷贝(阮一峰的深拷贝对数组来说,不是很严谨,会有问题,自己改进了下)

1、简单版(只考虑是引用对象的情况)

<script>
// 深拷贝方法
function deepCopy(data) {
	var c = data.constructor === Array ? [] : {};
	
	for(var k in data) {
		if (typeof data[k] === 'object') {
			c[k] = deepCopy(data[k]);
		} else {
			c[k] = data[k];
		}
	}
	return c;
};

var data1 = [{
	a: 1
}, 1, 2];

var data2 = {
	a: 1212,
	c: {
		b: 1,
		d: [4, 5, 6]
	},
	d: [1, 2, 3]
}
console.log(deepCopy(data1));
console.log(deepCopy(data2));

</script>

2、全面版

  • 需要考虑函数、正则、日期、ES6新对象
  • 需要考虑循环引用问题
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)
     const cloneTarget = Array.isArray(target) ? [] : {}
     for(var prop in target) {
         cloneTarget[prop] = _completeDeepClone(target[prop], map)
     }
     return cloneTarget
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值