js:深拷贝和浅拷贝区别,以及实现深拷贝的方法

定义:
  • 浅拷贝:复制一份引用,所有引用对象都指向一份数据,并且都可以修改这份数据。
  • 深拷贝(复杂):复制变量值,对于非基本类型的变量,则递归至基本类型变量后,再复制。

1.深拷贝

  • 1.1. 最简单的方法就是JSON.parse(JSON.stringify())
function deepCopy(obj) {
    return JSON.parse(JSON.stringify(obj))
}

var obj = {
    age: 1,
    name: undefined,
    sex: null,
    tel: /^1[34578]\d{9}$/,
    say: () => {
        console.log('hahha')
    }
}
console.log(deepCopy(obj)); // { age: 1, sex: null, tel: {} }

注意:这种拷贝方法不可以拷贝一些特殊的属性(例如正则表达式,undefine,function)

  • 1.2. 用递归去复制所有层级属性
function deepCopyTwo(obj) {
    let objClone = Array.isArray(obj) ? [] : {};
    if (obj && typeof obj == 'object') {
        for (const key in obj) {
            //判断obj子元素是否为对象,如果是,递归复制
            if (obj[key] && typeof obj[key] === "object") {
                objClone[key] = deepCopyTwo(obj[key]);
            } else {
                //如果不是,简单复制
                objClone[key] = obj[key];
            }
        }
    }
    return objClone;
}
var obj = {
    age: 1,
    name: undefined,
    sex: null,
    tel: /^1[34578]\d{9}$/,
    say: () => {
        console.log('hahha')
    }
}
console.log(deepCopy(obj));  // { age: 1, sex: null, tel: {} }
  1. 浅拷贝
  • 2.1. 浅拷贝只是拷贝基本类型的数据,如果父对象的属性等于数组或另一个对象,那么实际上,子对象获得的只是一个内存地址,因此存在父对象被篡改的可能,浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。
		function simpleClone(initalObj) {    
          var obj = {};    
          for ( var i in initalObj) {
            obj[i] = initalObj[i];
          }    
          return obj;
        }

		var obj = {
          a: "hello",
          b:{
              a: "world",
              b: 21
            },
          c:["Bob", "Tom", "Jenny"],
          d:function() {
              alert("hello world");
            }
        }
       
        var obj1 = simpleClone(obj);
        console.log('obj1=>>>',obj1); // { a: "hello", b: {a: "world", b: 21}, c: (3) ["Bob", "Tom", "Jenny"], d: ƒ () }
        
        obj1.c = ['mm', "Tom", "Jenny"]; // 一层,作为整体,重写,全改变;改变属性值,不改变原对象
        console.log('obj=>>>',obj); // obj.c => ["Bob", "Tom", "Jenny"]
        
      obj1.c[0] = 'mm'; // 浅拷贝时,改变属性的属性值,改变原对象
        console.log('obj=>>>',obj); // obj.c => ["mm", "Tom", "Jenny"]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值