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日

相关文章

  • 电脑上的安卓系统——PhoenixOS浅度体验

    Spire.Doc组件的完整攻略 Spire.Doc是一款强大的文档处理组件,它可以帮助开发人员快速创建、读取、编辑和转换各种文档格式,包括Word、PDF、HTML、RTF等。本文将为您详细讲解Spire.Doc组件的使用方法,包括组件的安装、文档的创建和编辑、文档的转换等内容。 组件的安装 Spire.Doc组件的安装非常简单,只需要按照以下步骤进行即可…

    other 2023年5月6日
    00
  • 哔哩哔哩怎么查看IP地址?哔哩哔哩查看IP地址教程

    哔哩哔哩怎么查看IP地址攻略 如果你想在哔哩哔哩(Bilibili)上查看IP地址,可以按照以下步骤进行操作: 步骤一:打开哔哩哔哩网站 首先,在你的浏览器中打开哔哩哔哩的官方网站 https://www.bilibili.com。 步骤二:登录你的账号 如果你已经有一个哔哩哔哩的账号,请在网站右上角点击登录按钮,并输入你的账号和密码进行登录。如果你还没有账…

    other 2023年7月30日
    00
  • Android自定义ViewGroup实现竖向引导界面

    Android自定义ViewGroup实现竖向引导界面攻略 在本攻略中,我们将详细讲解如何使用自定义ViewGroup来实现一个竖向引导界面。这个引导界面将包含多个页面,用户可以通过滑动来切换页面。 步骤一:创建自定义ViewGroup 首先,我们需要创建一个自定义的ViewGroup类,用于承载引导页面的内容。我们可以继承现有的ViewGroup类,例如L…

    other 2023年8月21日
    00
  • 桌面上文件夹删不掉怎么回事

    当桌面上的文件夹无法被删除时,一般是由于文件夹被其他程序占用,或者当前用户没有足够的权限删除导致的。下面提供几种解决方法。 方法一:关闭占用文件夹的程序 如果文件夹被其他程序占用,那么系统会阻止此文件夹被删除。此时可以通过关闭占用此文件夹的程序,来尝试删除文件夹。具体步骤如下: 打开任务管理器,找到正在占用此文件夹的程序; 右键点击该程序,选择“结束任务”;…

    其他 2023年4月16日
    00
  • win7系统鼠标右键没响应怎么办?win7系统浏览网页点击鼠标右键没反应的两种解决方法

    针对win7系统鼠标右键没响应的问题,以下是两种解决方法: 方法一:检查鼠标驱动 鼠标右键无响应的情况,第一步需要检查鼠标驱动是否正常,可以尝试以下步骤: 在桌面上单击“计算机”图标; 展开控制面板,选择“设备管理器”; 在设备管理器的“鼠标和其他指向设备”下,找到你的鼠标,右键选择“属性”; 在属性窗口中选择“驱动程序”选项卡,然后选择“更新驱动程序”; …

    other 2023年6月27日
    00
  • Ant Design Vue Pagination分页组件的封装与使用

    Ant Design Vue是基于Vue.js框架的UI组件库,提供了一系列优美且易于使用的组件,包括表格、表单、菜单栏、分页器等。其中,分页器Pagination是一个常用的组件,用于分页展示数据列表,本文将介绍Ant Design Vue Pagination分页组件的封装与使用。 安装Ant Design Vue Ant Design Vue的安装非常…

    other 2023年6月25日
    00
  • Layui之table中的radio在切换分页时无法记住选中状态的解决方法

    下面是详细的攻略过程。 问题描述 Layui是一款非常流行的前端UI框架,其中table组件提供了类似于网页中的表格功能。在使用table时,可能会遇到一个问题:table中的radio在切换分页时无法记住选中状态。 具体来说,当表格有多页时,用户在当前页选择了某个radio之后,当切换到其他页再回来时,之前选中的radio会被取消选中状态,导致用户体验不佳…

    other 2023年6月27日
    00
  • 惠普HP DeskJet2600打印机怎么设置EWS管理员密码?

    下面我将详细讲解“惠普HP DeskJet2600打印机怎么设置EWS管理员密码”的完整攻略。 什么是EWS管理员密码 EWS是Embedded Web Server(嵌入式Web服务器)的缩写,是一种通过Web浏览器访问和管理设备配置的方式。管理员可以使用EWS来配置打印机设置、网络设置、安全设置和其他高级选项。为了保护打印机的安全,通常会设置一个EWS管…

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