原生js底层基础(十四)JavaScript 深浅克隆

本文中提到的克隆,即封装一个方法,将一个原有的对象克隆出一个新的对象,具有和原对象一样的内容。分为浅层克隆和深层克隆,这也是经常出现在笔试题中的一个知识点。

1.浅层克隆

即原始值的属性值各自更改互不影响,引用类型值更改互相影响,因此一般用于非对象类型的拷贝

function clone(origin,target){
	var target = target || {};
	for(var prop in origin){
		target[prop] = origin[prop];
	}
	return target;
}
var obj = {
	name:"wxt",
	sex:'female',
	hobby:{
		reading:'technolege'
	}
} 
var newobj = clone(obj);

浅层克隆有个局限的地方,此时如果复制的这个对象newobj 将自己对象体中的对象做了改变,例如newobj.hobby.reading=‘fashion’, 那么obj的hobby.reading属性也跟着变了,于是就有了深层克隆

2.深层克隆

即原始值的属性值各自更改互不影响,引用类型值更改也互不影响
上面说了,为了避免原对象中具有引用类型的值,造成原对象和新对象互相影响的情况,应封装一个深层克隆。思路是:判断出原对象某个值是引用类型后,先赋值新对象一个相同的属性名,属性值则再次递归使用函数去判断(有可能多层都是引用类型对象),直到找到一个不是引用值的,才直接复制

function deepClone (origin,target){
	var target = target || {}
	var toStr  = Object.prototype.toString;
	var arrStr = '[Object Array]';
	for(var prop in origin){
		if(origin.hasOwnProperty(prop)){
			if(typeof (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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值