深拷贝方法大全,前端面试必备

js里面的深拷贝是针对引用数据类型才有的,对于基本数据类型则没有这种深拷贝与浅拷贝之分。因为基本数据类型是名和值都存储在栈内存里,而引用数据类型是名存储在栈内存,他的值则指向堆内存空间。

let arr1 = [1,2,3,4]
let arr2 = arr1
这里会将arr2和arr1共用一个堆内存指向,所以不管之后对两个数组
如何操作都是作用在同一个堆。这种也是我们所说的浅拷贝

那么如何对一个对象进行深拷贝呢?
方法一:运用JSON.stringify()与JSON.parse(),这种比较简单,有兴趣可以百度
方法二:接下来我要介绍的是另一个方法,可以对传入的数组或者对象进行深拷贝,通过自己写的函数功能可以实现深拷贝、

 let hardClone = function fnHardClone(obj) {
      // 定义两个变量,一个是返回的对象result,一个是对象的key
      let result = typeof obj.slice === "function" ? [] : {},
        key;
      // 上面是根据传入的obj做一个三元表示式判断
      //,如果他有slice方法,则证明我们要获得的result是个数组
      if (obj && typeof obj === "object") {
        for (key in obj) {
          //遍历这个obj
          if (obj[key] && typeof obj[key] === "object") {
            result[key] = hardClone(obj[key]);
            // 如果这个obj[key]里面的值是一个obj对象,要继续遍历,所以用递归
          } else {
            result[key] = obj[key];
          }
        }
        return result;
      }
      return obj;
    };
    var arry1 = [1, 2, 3, 4];
    var arry2 = hardClone(arry1);
    arry1.shift();
    console.log(arry1);
    console.log(arry2);

方法三:利用展开运算符‘’实现数组或对象的深拷贝。

let arr1 = [1, 2, 3];
let arr2 = [...arr1];
console.log(arr1, arr2);
console.log(arr1 === arr2);
// 输出结果为
/* [ 1, 2, 3 ] [ 1, 2, 3 ]
false */
let objA = { a: 1, b: 2 };
let objB = { ...objA };
console.log(objA, objB);
console.log(objA === objB);
//输出结果为
/* { a: 1, b: 2 } { a: 1, b: 2 }
false */

通过以上代码的演示,可以很明显的看出arr2是arr1的深拷贝,objB是objA的深拷贝。
好了,以上就是我要介绍的方法,如果对你有帮助的话记得三连,感谢。

请允许自己写出垃圾,否则,你连垃圾都写不出来。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值