浅拷贝和深拷贝的简单实现

浅拷贝:

function clone(origin,target){
	var target=target || {}   //如果没有传target的话就自动传一个空对象进去
	for(var key in origin){
		target[key]=origin[key]
	}
	return target;
}

浅拷贝有个缺点,就是如果origin或者target的引用值(array、object)类型的值改变的话,一定会影响到另一个的值也跟着改变,然而深拷贝可以解决这个问题。

深拷贝:

//1.遍历对象   for(var key in obj)
//2.判断是不是原始值(null,string,undefined,boolean,number)  typeof  'object',因为用typeof操作数组和null和对象都返回对象‘object’,这里先不考虑null,因为没意义
//3.不是原始值的话判断是数组还是对象   toString,instanceof,construct
//4.建立相应的数组或对象
//5.递归
function deepClone(origin,target){
	var target=target || {}   //如果没有传target的话就自动传一个空对象进去
	 for(var key in origin){
		if(origin.hasOwnProperty(key)) {  //判断是不是私有属性,不要原型链上的
			if(typeof(origin[key])=='object'){   //如果是返回对象类型
				if(origin[key]!=='null'&&Object.prototype.toString.call(origin[key])=='[object Array]'){    //如果是数组类型
					target[key]=[];   //建立相应的数组
				}else{   //否则是对象类型
					target[key]={};    //建立相应的对象
				}
				deepClone(origin[key],target[key])     //递归
			}else{    //如果是返回原始值类型
				target[key]=origin[key]
			}
		}
	}
	return target;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值