ES5,ES6浅层深层克隆的对比


]

ES5 :原生方法

ES6 :使用展开运算符 …

ES5

浅层克隆和深层克隆的概念和方法

1.概念

在javascript中,把目标对象的属性值复制到一个新对象中,把目标对象中的属性值原封不动的复制到新对象中就是浅层克隆,此时若存在符合属性(对象,数组),新旧两个对象里面存储的指针指向同一个房间,即两者间会相互影响,为了解决互相影响的问题,需要使用深度克隆。

2.浅层克隆的方法

	
 
    var car1 = {
		name : 'marzs',
		color: 'red',
		attribute :{
			heiight : '5.2m',
			weight : '500kg'
		},
		type:['0071','0082','0093'],
        print(){
            console.log(this.color,this.name)
        }
	}
    var car2 = {};
// 封装一个函数  把car1 的属性克隆给 car2
	function clone (target,origin){
	var traget = target || {}  // 做个兼容
	for(prop in origin){
		target[prop] = origin[prop];
		}
		return target
	}	
	clone(car2,car1)

console.log(car1.attribute === car2.attribute)  //true  指针指向同一个房间
console.log(car1.type === car2.type)  // true
console.log(car1.print === car2.print)  // true

3.深层克隆的方法

1.原理

利用递归的思想,当在属性中碰到对象,数组这样的复合属性时,一层一层的复制属性里面的原始值。

	 
    var car1 = {
		name : 'marzs',
		color: 'red',
		attribute :{
			heiight : '5.2m',
			weight : '500kg'
		},
		type:['0071','0082','0093'],
        print(){
            console.log(this.color,this.name)
        }
	}
	  var car2 = {};
	 // 封装一个深层克隆的函数
	 function deepClone(Origin, Target) {
        var Target = Target || {};
        var toStr = Object.prototype.toString; //原型链上的toString方法,判断是数组还是对象
        var arrStr = '[object Array]';
        for (var prop in Origin) {
            if (Origin.hasOwnProperty(prop)) {
                if (Origin[prop] !== 'null' && typeof (Origin[prop]) == 'object') {
                    // if (toStr.call(Origin[prop]) == arrStr) {
                    //     Target[prop] = [];
                    // } else {
                    //     Target[prop] = {};
                    // }
                    toStr.call(Origin[prop]) == arrStr ? Target[prop] = [] :Target[prop] = {};
                    deepClone(Origin[prop], Target[prop])
                } else {
                    Target[prop] = Origin[prop];
                }
            }
        }
        return Target
    }
 
    deepClone(car2,car1)
console.log(car1.attribute === car2.attribute)  //false  
console.log(car1.type === car2.type)  // false
console.log(car1.print === car2.print)  // false
	  

ES6

浅层克隆和深层克隆的方法

注:ES6的出现,就是为了解决ES5 中代码的冗余,和一些容易发生的错误,降低代码出错的几率 ,使用 (...) 剩余运算符来实现克隆

1.浅层克隆

	    const car1 = {
		name : 'marzs',
		color: 'red',
		attribute :{
			heiight : '5.2m',
			weight : '500kg'
		},
		type:['0071','0082','0093'],
        print(){
            console.log(this.color,this.name)
        }
	}
	  const car2 = {
		...car1   // 剩余运算符展开对象为ES7的语法
	};
	  
console.log(car1.attribute === car2.attribute)  //true  指针指向同一个房间
console.log(car1.type === car2.type)  // true
console.log(car1.print === car2.print)  // true

2.深层克隆

	    const car1 = {
		name : 'marzs',
		color: 'red',
		attribute :{
			heiight : '5.2m',
			weight : '500kg'
		},
		type:['0071','0082','0093'],
        print(){
            console.log(this.color,this.name)
        }
	}
	  const car2 = {
		...car1 
		attribute{
			...car1.attribute  //会覆盖之前的
		}
		type:[...car1.type]  //剩余运算符展开对象为ES6的语法
	};
// 当知道目标对象有哪些值是复合属相时,可以如此操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值