js深拷贝与浅拷贝一文彻底搞懂

JS深拷贝与浅拷贝一文彻底搞懂

什么是深拷贝与浅拷贝

在JavaScript中,由于对象和数组是通过引用传递的,所以需要特别注意拷贝的方式。拷贝的方式可以分为两种:深拷贝和浅拷贝。

深拷贝会复制一个对象或数组,包括其所有的嵌套属性和子元素,而浅拷贝只是复制了对象或数组本身,并没有复制嵌套的属性或子元素。

深拷贝

以下是一种常见的深拷贝方法,通过递归函数来实现:

function deepClone(obj) {
  if (typeof obj !== 'object' || obj === null) {
    return obj;
  }
  let newObj = Array.isArray(obj) ? [] : {};
  for (let key in obj) {
    if (obj.hasOwnProperty(key)) {
      newObj[key] = deepClone(obj[key]);
    }
  }
  return newObj;
}

上述代码中,首先判断传入的参数是否为对象或数组,如果不是则直接返回。如果是,则判断是对象还是数组,使用不同的方法创建一个新的对象或数组,并循环原对象或数组中的所有属性或子元素,使用递归的方式对其进行深拷贝。

一个示例:

let originalObj = {
  a: 1,
  b: {
    c: 2
  }
};
let clonedObj = deepClone(originalObj);
originalObj.b.c = 3;

console.log(originalObj); // {a: 1, b: {c: 3}}
console.log(clonedObj); // {a: 1, b: {c: 2}}

在这个示例中,我们创建了一个原始对象originalObj,然后使用deepClone方法进行深拷贝得到一个新的对象clonedObj。接着,我们对原始对象originalObjb.c属性进行修改,并输出两个对象的值。可以发现,修改原始对象并不会影响到克隆对象,证明深拷贝是生效的。

浅拷贝

以下是三种常见的浅拷贝方法:

方法一:对象的扩展运算符(Spread Operator)

let originalObj = {
  a: 1,
  b: {
    c: 2
  }
};
let copiedObj = {...originalObj};
originalObj.b.c = 3;

console.log(originalObj); // {a: 1, b: {c: 3}}
console.log(copiedObj); // {a: 1, b: {c: 3}}

在这个示例中,我们使用了对象的扩展运算符...进行浅拷贝。新对象copiedObj中的b属性与原始对象中的b属性指向同一个引用,所以修改原始对象中的b.c属性也会影响到新对象中的b.c属性。

方法二:Object.assign()方法

let originalObj = {
  a: 1,
  b: {
    c: 2
  }
};
let copiedObj = Object.assign({}, originalObj);
originalObj.b.c = 3;

console.log(originalObj); // {a: 1, b: {c: 3}}
console.log(copiedObj); // {a: 1, b: {c: 3}}

在这个示例中,我们使用了Object.assign()方法进行浅拷贝。同样,新对象copiedObj中的b属性与原始对象中的b属性指向同一个引用,修改原始对象中的b.c属性也会影响到新对象中的b.c属性。

方法三:数组的slice()方法

let originalArr = [1, 2, 3];
let copiedArr = originalArr.slice();
originalArr.push(4);

console.log(originalArr); // [1, 2, 3, 4]
console.log(copiedArr); // [1, 2, 3]

在这个示例中,我们使用了数组的slice()方法进行浅拷贝。新数组copiedArr与原始数组中的元素是值拷贝关系,因此修改原始数组并不会影响到新数组。

总结

在JavaScript中,深拷贝和浅拷贝是两种常见的拷贝方式。深拷贝会复制一个对象或数组,包括其所有的嵌套属性和子元素,而浅拷贝只是复制了对象或数组本身,并没有复制嵌套的属性或子元素。

对于深拷贝,可以使用递归函数的方式进行实现。对于浅拷贝,可以使用对象的扩展运算符、Object.assign()方法或数组的slice()方法进行实现。在实际应用中,需要根据具体情况选择合适的拷贝方式,特别是对于嵌套的对象或数组,需要特别注意选择深拷贝或浅拷贝方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js深拷贝与浅拷贝一文彻底搞懂 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 基于jquery的lazy loader插件实现图片的延迟加载[简单使用]

    了解基于jquery的Lazy Loader插件以及实现图片的延迟加载的攻略,可以按照以下步骤进行: 1. 下载并引入jquery.lazyload.js文件 jQuery lazyload插件的下载地址:https://github.com/tuupola/jquery_lazyload。下载完成后,将jquery.lazyload.js文件引入到HTML…

    other 2023年6月25日
    00
  • Android应用内调用第三方应用的方法

    Android应用内调用第三方应用的方法 要在Android应用内调用第三方应用,可以使用隐式意图(Implicit Intent)来实现。以下是详细步骤: 确定要调用的第三方应用的包名和启动Activity的类名。 创建一个隐式意图,并设置要调用的第三方应用的包名和启动Activity的类名。 java Intent intent = new Intent…

    other 2023年10月14日
    00
  • matlab进行数值微分

    以下是“MATLAB进行数值微分”的完整攻略: MATLAB进行数值微分 数值微分是一种常用的数值计算方法,可以用于计算的导数。MATLAB提供多种数值微分函数以下是使用MATLAB进行数值微分的步骤: 定义函数。 在使用MATLAB进行数值微分之前,您需要定义一个函数。以下是一个示例: matlab y = f(x) y = sin(x); end 在上面…

    other 2023年5月7日
    00
  • MySQL高可用解决方案MMM(mysql多主复制管理器)

    MySQL高可用解决方案MMM(MySQL Multi-Master Replication Manager)是一个用于管理MySQL多主复制系统的工具,它可以自动化地切换主站节点,保证多节点的高可用性。 MMM主要由以下三个组件组成: Master Agent:在每个主服务器节点上运行的守护程序; Master Monitor:安装在一个或多个监视器上的监…

    other 2023年6月26日
    00
  • 利用opencv实现图片的配准/对齐

    以下是关于“利用opencv实现图片的配准/对齐”的完整攻略,包含两个示例。 背景 图像配准/对齐是指将多图像中的相同场景进行对齐,使得它们在像素级别上对应。在计算机视觉领域,图像配准/对齐是一个重要的问题。OpenCV是一个流行的计算机视觉库,它提供了许多图像配准/对齐的算法和工具。 安装 在使用OpenCV之前,我们需要先安装它。具体步骤如下: 安装Op…

    other 2023年5月9日
    00
  • iphone6 plus无限重启怎么办?苹果6plus自动重启蓝屏解决方法详解

    iPhone 6 Plus 无限重启问题解决方法 问题描述 iPhone 6 Plus 在使用过程中出现了无限重启或自动重启蓝屏的问题,这种问题常见于系统、硬件故障等。如果这种问题使你苦恼,不用担心,下面提供了一些解决方法。 解决方法 方法一:重置设备 如果可能,首先尝试重置设备。重置设备将清除设备上的所有数据,所以请确保提前备份现有的数据。操作步骤如下: …

    other 2023年6月27日
    00
  • express的session函数

    Express的Session函数 在Node.js中,Express是一个非常流行的Web框架。它提供了一些强大的功能,其中之一是Session。需要保存用户数据时,Session是非常有用的工具。Session能够在不同的请求之间保持上下文数据,并且可以在整个应用程序中使用。在Express中,Session是通过express-session库来实现的…

    其他 2023年3月28日
    00
  • curl是否不能识别为内部或外部命令?

    以下是关于“curl是否不能识别为内部或外部命令?”的完整攻略,包含两个示例。 curl是否不能识别为内部或外部命令? 在使用curl命令,有时会出现“不是内部或外部命令”的错误提示。这通常是因为系统没有将curl添加到环境变量。以下是关于如何解决这个问题的详细攻略。 1. 添加curl到环境变量 在Windows系统中,我们可以curl添加到环境变量中,以…

    other 2023年5月9日
    00
合作推广
合作推广
分享本页
返回顶部