欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

浅析JS的深拷贝与浅拷贝

程序员文章站 2022-05-28 14:30:40
...

前言:

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

一、深拷贝VS浅拷贝

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

二、场景

基本类型对象赋值:

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
  }

这样即可实现深拷贝。