js克隆

JavaScript中的克隆分为浅层克隆和深层克隆。

浅层克隆:

var obj = {
		name : 'abc',
		age : 123,
		sex : 'female',
			card:['visa','unionpay']
	 }
	 
var obj1 = {}

function clone (origin,target) {
	var target = target || {};
	for (var prop in origin) {
		target[prop] = origin[prop];
	}
	return target;
}
clone(obj,obj1)

创建两个对象obj和obj1,对象obj里面是由属性和属性值的,而obj1是一个空的对象,里面什么东西都没有,现在我们是想把对象obj中的属性克隆到空对象obj1里面。

封装一个克隆功能的函数clone,遍历对象中的原始值或者引用值,然后进行克隆。再返回克隆的结果。

改变各自的原始值不会互相影响到,
不过这种浅层克隆存在一个不足就是:改变引用值会互相影响到
在这里插入图片描述

所以就引出了深层克隆:

深层克隆:克隆过来的属性是一样的,改变原始值或者引用值不会互相影响到。

var obj = {
	name : 'sunny',
	age : 10,
	card : ['visa','master'],
	wife : {
		name : 'xiaoming',
		son : {
			name : 'zhangsan'
		}
	}
	
}
var obj1 = {
    
}

首先我们要遍历对象 for(var prop in obj)

1.判断是不是原始值, typeof() object–>引用值

2.如果是引用值,判断是数组还是对象
(instanceof toString constructor)

3.建立相应的数组或对象

4.递归

封装一个克隆功能函数:

function deepClone(origin,target){
	var target = target || {},
	     toStr = Object.prototype.toString,
	     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、付费专栏及课程。

余额充值