js实现深度克隆

克隆是一个递归的过程:大概分为以下几步:

  1. 遍历对象    for in  或者  for of
  2. 判断是否是这个对象的属性  hasOwnProperty( )
  3. 判断是否具这个属性值的类型是否是object  typeof(value ) === 'object',是则直接放入要克隆到的对象中,否则再判断是数组还是object ,这里是用的是Object的toString() 这个方法不同的类型会返回不同值,根据是数组还是object再次递归
function deppClone (origin, target) { // origin是被克隆的对象, target是克隆到的对象
	var toStr = Object.prototype.toString,  // 先定义出来 免得下面调用的时候写很长的名字
	arryStrName = '[object Array]'   // 这个是当数组的时候toStr返回的值
	for(var prop in origin) {						// 遍历
		if (origin.hasOwnProperty(prop)) {	// 检测是否有这个属性在本对象中
			if (origin[prop] !== 'null' && typeof(origin[prop]) === 'object') {	//  null 和 array 使用typeof都返回object 这里只需要数组  去掉null
				target[prop] = (toStr.call(origin[prop]) === arryStrName) ? [] : {} // 根据情况初始化
				deppClone(origin[prop], target[prop])	//  如果是引用那么调用这个来递归
			} else {
				target[prop] = origin[prop]	// 不是引用的话直接将值放入到target中
			}
		}
	}
}
var a = {
	arr: ['a'],
	name: 'long',
	age: 12
}
var b = {}
var b = deppClone(a, b)

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值