深度克隆的步骤

var obj = {

name : “abc”,

age : 123,

card : [‘visa’, ‘master’], //原始对象

wife : {

name : “bcd”,

son : {

name : “aaa”

}

}

}

var obj1 = {

name : “abc”,

age : 123,

card : [ obj.card[ 0 ],obj.card[ 1 ] ],

//要拷贝的对象,进行 obj 里面的数组,对这个数组的拷贝再一次拷贝

wife : {

name : “bcd”,

son : {

name : “aaa”

}

}

}

function deepClone(origin, target){

var target = target | | {}, //有就用你的,没有就用后面的

toStr = Object.prototype.toString, //引用,目的是简化

arrStr = “ [ Object Array ] ”; //引用,目的是简化比对

for ( var prop in origin ) { //从原始 origin 拷贝到 target

if( origin . hasOwnProperty( prop ) ){ //先判断是不是原型上的属性,如果是

false 就是原型上的

if( typeof (origin [ prop ] ) !== “null” && typeof ( origin [ prop ] ) ==

‘object’) {

if ( toStr.call( origin [ prop ] ) ) == arrStr ){

target [ prop ] = [ ];

}else{

target [ prop ] = { };

}

deepClone ( origin [ prop ], target [ prop ]);

}else{ //else 后面是原始值

target [ prop ] = origin [ prop ];

}

}

}

return target;

}

深度克隆的步骤

1、先把所有的值都遍历一遍(看是引用值和原始值)

用 for ( var prop in obj ),对象和数组都可以使用

2、判断是原始值,还是引用值?用 typeof 判断是不是 object

1)如果是原始值就直接拷贝

2)如果是引用值,判断是数组还是对象

3、判断是数组还是对象?(方法 instanceof【看 a 的原型链上有没有 b 的原型】、

toString、constructor,建议用 toString,另外两个有个小 bug——跨父子域不行)

1)如果是数组,就新建一个空数组;

2)如果是对象,就新建一个空对象。

4、建立了数组以后,如果是挨个看原始对象里面是什么,都是原始值就可以直接考

过来了;或者,建立了对象以后,挨个判断对象里面的每一个值,看是原始值还是

引用值

5、递归

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值