js 拷贝

概念

对于基础值来说,拷贝就是值的拷贝,但对于引用值来说,可分为

  • 赋值:拷贝引用值的地址
  • 浅拷贝:拷贝一层值
  • 深拷贝:拷贝所有层。

基本原理

赋值

var obj = {
	a: 1,
	b: [1,2]
}

var copy = obj;
obj.a = 2;
obj.b[0] = 2;
console.log(copy); // {a: 2, b: [2,2]}

直接拷贝的是引用值的地址,对象内发生任何变化,两个引用均发生相应的变化。

浅拷贝

function simpleClone(origin) {
	target = {};
	for (var prop in origin) {
        if (origin.hasOwnProperty(prop)) {
		    target[prop] = origin[prop];
        }
	}
	return target;
}
var obj = {
	a: 1,
	b: [1,2]
}
var copy1 = simpleClone(obj);
obj.a = 2;
obj.b[0] = 2;
console.log(copy1); //{a: 1,b: [2,2]}

浅拷贝是拷贝了一层基础值的值,但并未拷贝引用值的根本值,在例子中可以看到,改变obj中的引用值,拷贝的对象中仍然改变。

深拷贝

function deepClone(origin, target) {
	target = target || {};
	for (var prop in origin) {
		if (origin.hasOwnProperty(prop)){
			//引用值
			if(typeof(origin[prop]) == 'object' && origin[prop] !== null) {
				//数组处理
				if(Object.prototype.toString.call(origin[prop]) == '[object Array]') {
					target[prop] = [];
				} else {
					//对象处理
					target[prop] = {};
				}
				deepClone(origin[prop], target[prop]);	
			} else {
				//基础值赋值
				target[prop] = origin[prop];
			}		
		}
	}
	return target;
}
var obj = {
	a: 1,
	b: [1,2]
}
var copy1 = deepClone(obj);
obj.a = 2;
obj.b[0] = 2;
console.log(copy1); //{a: 1,b: [1,2]}

注意:本例子中只考虑了对象内属性为数组和对象的情况。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值