js 浅拷贝(浅复制、浅克隆)、深拷贝(深复制、深克隆)

  1. 浅拷贝:拷贝对象A时,对象B将拷贝A的所有字段,如果字段是内存地址,B将拷贝地址,如果对象时基元类型,B将复制其值。它的缺点是如果你改变了对象B所指向的内存地址,你同时也改变了对象A指向这个地址的字段。
  2. 深拷贝:这种方式会完全拷贝所有数据,优点是B与A不会相互依赖(A,B完全脱离关联), 缺点是拷贝的速度更慢,代价更大。
  • 浅拷贝实现:

Object.prototype.num = 1;
let person1 = {
	name:'Jack',
	age:'35',
	height:'75kg',
	son1:{
	        name:'Join',
		age:'15'
	},
	son2:{
		name:'Lisa',
		age:10
	},
	cars:['landrover','benz'],
	skill:function(){
		console.log('work');
	}
};
		
let person2 = clone(person1);
//浅复制
function clone(origin,target){
	let tar = target || {};
			
	for(let key in origin){
		if(origin.hasOwnProperty(key)){//该属性或者方法是该对象自身定义的而不是器原型链中定义的 则返回true;否则返回false
			tar[key] = origin[key];
		};
	};
			
	return tar;
};
复制代码

  • 深复制

  1. JSON实现:JSON.stringify()+JSON.parse();
  2. jQuery中的$.extend():$extend(true,{},b);
  3. 原生方法实现:

function deepClone(origin,target){
	let tar = target || {};
	let toStr = Object.prototype.toString;
	let arrType = '[object Array]';
			
        for(let key in origin){
		if(origin.hasOwnProperty(key)){
			if((typeof origin[key])==='object'&&origin[key]!==null){
				if(toStr.call(origin[key])===arrType){
					tar[key] = [];
				}else{
					tar[key] = {};
				};
				deepClone(origin[key],tar[key]);
			}else{
				tar[key] = origin[key];		
			};
		};
	};
			
	return tar;
};
复制代码


转载于:https://juejin.im/post/5c2090ab51882545e24f1f1d

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值