封装浅层克隆 深层克隆

1、浅层克隆

注意:这种浅层克隆只能正常修改原始值,修改引用值时会将原本的也修改。

// 克隆
var obj = {
	name : '张三',
	age : 12,
	sex : 'male',
	arr : [1,2,3,4]
}

var obj1 = {};

// 自己写一个浅层克隆
function clone(origin,target){
	// 作一个兼容  如果有传target就用target,没有就自己定义个{}
	var target = target || {};
	for(var prop in origin){
		target[prop] = origin[prop];
	}
}

clone(obj,obj1);

// // 注意:
// //这种浅层克隆只能正常修改原始值,修改引用值时会将原本的也修改。
// obj1.name = '李四';//正常只有obj1修改,obj不变
// obj1.arr[4] = 5;//obj1  obj都会被修改

 2、深层克隆

// 深层克隆

var obj = {
	name : 'abc',
	age : 12,
	arr : [1,2,3,4,5],
	json : {
		a : 'a',
		b : [4,5,6,7],
		c : {
			d : 'd',
			e : 'e'
		}
	}
}
var obj1 = {};
// 思路:
// 用typeof来区分出引用值跟原始值
// 用Object.prototype.toString.call()来区分数组跟json

function deepClone(origin,target){
	var target = target || {},
		toStr = Object.prototype.toString,
		arrType = '[object Array]';
	for(var prop in origin){
		// 只想克隆对象自身的属性,不想要原型链上的属性。
		// 用hasOwnProperty判断是否是自身的属性
		if (origin.hasOwnProperty(prop)) {
			// 要判断的是origin[prop]的值是否引用,不是键
			// 所以要对origin[prop]类型做判断。而且排除null的类型。
			if (origin[prop] !== 'null' && typeof origin[prop] == 'object') {
				// 引用值的情况
				if (toStr.call(origin[prop]) == arrType) {
					// 是数组的情况
					target[prop] = [];
				}else{
					// json
					target[prop] = {};
				}
				// 由于数组也可用for in 直接用递归,再次拷贝引用值内的值
				deepClone(origin[prop],target[prop]);

			}else{
				// 原始值的情况  直接拷贝赋值
				target[prop] = origin[prop];
			}
		}
	}
}


deepClone(obj,obj1)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值