浅析JS的深拷贝与浅拷贝

前言:

前段时间在做前端项目时,吃了深拷贝与浅拷贝的亏,今天就来整理一下这两者的区别。

一、深拷贝VS浅拷贝

讲到深拷贝与浅拷贝,我们先要弄清楚什么是深拷贝,什么是浅拷贝?
深拷贝:不仅拷贝对象的引用,同时也拷贝对象的实体,也就是它的地址。它将对象的所有层次都拷贝了。这样进行深拷贝后两个对象相互独立,其中一个对象的改变不会影响到另一个对象。
浅拷贝:仅仅拷贝对象的引用,但是不拷贝对象的地址。它只拷贝对象的第一层。这两个对象的引用其实指向同一块地址,相当于一个身份证ID的人有多个外号,而这些外号都是这一个人。这样这些对象之间会相互影响,一个对象改变,其他也跟着改变。在这里插入图片描述

二、场景

基本类型对象赋值:

var a = [1,2,3];
var b = a;
b.push(4); // b中添加了一个4
console.log(a); // a变成了[1,2,3,4]

自定义对象:

var obj = {number:125};
var obj2 = obj;
obj2.number = 126; // obj2.number改变了,
console.log(obj.number); // 126,obj的number跟着改变

这是因为javascript默认是浅拷贝,拷贝完之后的引用指向同一片地址,改变其中一个值,其他的值也会改变。
显然浅拷贝将不同对象的

三、如何实现深拷贝

思路:赋值只能实现第一层的拷贝,我们递归拷贝对象的每一层。

function deepClone(obj){
  const objClone = Array.isArray(obj) ? [] : {}
  if (obj && typeof obj === 'object') {
    for (var key in obj) {
      if (obj.hasOwnProperty(key)) {
        // 判断ojb子元素是否为对象,如果是,递归复制
        if (obj[key] && typeof obj[key] === 'object') {
          objClone[key] = this.deepClone(obj[key])
        } else {
          // 如果不是,简单复制
          objClone[key] = obj[key]
        }
      }
    }
  }
  return objClone
  }

这样即可实现深拷贝。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值