- 浅拷贝:拷贝对象A时,对象B将拷贝A的所有字段,如果字段是内存地址,B将拷贝地址,如果对象时基元类型,B将复制其值。它的缺点是如果你改变了对象B所指向的内存地址,你同时也改变了对象A指向这个地址的字段。
- 深拷贝:这种方式会完全拷贝所有数据,优点是B与A不会相互依赖(A,B完全脱离关联), 缺点是拷贝的速度更慢,代价更大。
Object.prototype.num = 1;
let person1 = {
name:'Jack',
age:'35',
height:'75kg',
son1:{
name:'Join',
age:'15'
},
son2:{
name:'Lisa',
age:10
},
cars:['landrover','benz'],
skill:function(){
console.log('work');
}
};
let person2 = clone(person1);
function clone(origin,target){
let tar = target || {};
for(let key in origin){
if(origin.hasOwnProperty(key)){
tar[key] = origin[key];
};
};
return tar;
};
复制代码
- JSON实现:JSON.stringify()+JSON.parse();
- jQuery中的$.extend():$extend(true,{},b);
- 原生方法实现:
function deepClone(origin,target){
let tar = target || {};
let toStr = Object.prototype.toString;
let arrType = '[object Array]';
for(let key in origin){
if(origin.hasOwnProperty(key)){
if((typeof origin[key])==='object'&&origin[key]!==null){
if(toStr.call(origin[key])===arrType){
tar[key] = [];
}else{
tar[key] = {};
};
deepClone(origin[key],tar[key]);
}else{
tar[key] = origin[key];
};
};
};
return tar;
};
复制代码
转载于:https://juejin.im/post/5c2090ab51882545e24f1f1d