浅拷贝和深拷贝

浅拷贝:只能拷贝第一层,如果是多层嵌套还是跟着原来数据改变
深拷贝:拷贝出来的结果和以前没关系
浅拷贝
1for···in只循环第一层
// 只复制第一层的浅拷贝
function simpleCopy(obj1) {
   var obj2 = Array.isArray(obj1) ? [] : {};
   for (let i in obj1) {
   obj2[i] = obj1[i];
  }
   return obj2;
}
var obj1 = {
   a: 1,
   b: 2,
   c: {
         d: 3
      }
}
var obj2 = simpleCopy(obj1);
obj2.a = 3;
obj2.c.d = 4;
alert(obj1.a); // 1
alert(obj2.a); // 3
alert(obj1.c.d); // 4
alert(obj2.c.d); // 4
2、Object.assign方法(用于将所有可枚举属性的值从一个或多个源对象复制到目标对象)
注意:如果目标对象中的属性具有相同的键,则属性将被源对象中的属性覆盖。后面的源对象的属性将类似地覆盖前面的源对象的属性。
var obj = {
    a: 1,
    b: 2
}
var obj1 = Object.assign(obj);
obj1.a = 3;
console.log(obj.a) // 3
3... 扩展运算符
let boj={name:1,age:18}
let obj={...boj}  // {name: 1, age: 18}
深拷贝
1、通过JSON对象来实现深拷贝
let newObj = { ...school, ...my };
newObj = JSON.parse(JSON.stringify(newObj)); 
缺点: 无法实现对对象中方法的深拷贝,无法拷贝属性值为undefined的、正则对象的...
2、lodash函数库实现深拷贝
let result = _.cloneDeep(test)
3、通过jQuery的extend方法实现深拷贝
var array = [1,2,3,4];
var newArray = $.extend(true,[],array); // true为深拷贝,false为浅拷贝
4、手动实现深拷贝
const deepClone = (value ,hash = new WeakMap) => {
    if(value == null) return value; // 排除掉null 和undefine 的情况
    if(typeof value !== 'object') return value; // 这里包含了函数类型
    if(value instanceof RegExp) return new RegExp(value);
    if(value instanceof Date) return new Date(value);
    // .....
    let instance = new value.constructor; // 根据当前属性构造一个新的实例  attay||object

    if(hash.has(value)){        // 先去hash中查看一下是否存在过 ,如果存在就把以前拷贝的返回去 
        return hash.get(value); // 返回已经拷贝的结果
    }
    hash.set(value,instance);   // 没放过就放进去  
    
    // 拷贝的人可能是一个对象 或者是一个数组 (循环)  for in 
    for(let key in value){ // 一层
        if(value.hasOwnProperty(key)){ // 将hash 继续向下传递 保证这次拷贝能拿到以前拷贝的结果
            instance[key] = deepClone(value[key],hash); // 递归--产生的就是一个新的拷贝后的结果
        }// 过滤掉原型链上的属性
    }
    return instance
};
// hash = new WeakMap
// if(hash.has(value)){        
//     return hash.get(value); 
// }
// hash.set(value,instance);  
// 是为了解决拷贝时,对象某个属性等于自身而造成死循环问题  
// 例:
// let obj = {a:1};
// obj.b = obj;
// console.log(deepClone(obj));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值