前端 js深拷贝

知识铺垫

数据存储
Javascript中的数据分为原始值和引用值,对于原始值来说,它的值直接存储在栈内存中,而对于引用类型来说,它在栈内存中仅仅存储了一个引用,而真正的数据存储在堆内存中
浅拷贝
对于浅拷贝而言,就是只拷贝对象的引用,而不深层次的拷贝对象的值,多个对象指向堆内存中的同一对象,任何一个修改都会使得所有对象的值修改,因为它们公用一条数据
深拷贝
深拷贝不会拷贝引用类型的引用,而是将引用类型的值全部拷贝一份,形成一个新的引用类型,这样就不会发生引用错乱的问题,使得我们可以多次使用同样的数据,而不用担心数据之间会起冲突

深拷贝实现的方法:

  1. var target = JSON.parse(JSON.stringify(origin));
    缺点:不可以拷贝 undefined , function, RegExp 等等类型的;
  2. Object.assign(target, origin);
    缺点:只能拷贝一层
  3. 自己封装实现
function deepClone(origin, target){
	var target = target || {},
		toStr = Object.prototype.toString,
		arrStr = "[object Array]";
		
	for(var prop in origin) {
		if(origin.hasOwnProperty(prop)){
			if(typeof(origin[prop] !== null && origin[prop]) == 'object') {
				if(toStr.call(origin[prop]) == arrStr){
					target[prop] = [];
				}else{
					target[prop] = {};
				}
				deepClone(origin[prop], target[prop]);
			}else{
				target[prop] = origin[prop];
			}
		}
	}
	return target;
}

没做浏览器兼容

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值