javascript深拷贝(deepClone)详解

JavaScript 深拷贝 (DeepClone) 详解

什么是深拷贝?

深拷贝指的是将一个对象完整地复制到另一个对象中,新对象不仅包含了原对象的所有属性和方法,还包含了原对象引用的所有对象,也就是说,完全重新创建了一个新的对象。

为什么需要深拷贝?

在 JavaScript 中,对象是通过引用类型存储的,多个变量可能会引用同一个对象,这样在修改其中一个变量时,可能会影响到其他引用该对象的变量,而深拷贝可以避免这种问题。

如何实现深拷贝?

以下是几种常见的实现深拷贝的方法。

方法一:使用 JSON 解析和序列化

使用 JSON 的 stringify() 方法将对象转化为字符串,再使用 parse() 方法将字符串转化为新的对象。这种方法在大部分情况下都能够正常工作,但是有一些特殊类型的对象,如函数、正则表达式等,就无法转化,因此不适用于所有情况。

function deepClone(obj) {
  return JSON.parse(JSON.stringify(obj));
}

方法二:递归拷贝对象

使用递归的方式遍历对象和数组,复制每个属性。递归的过程中,需要判断当前属性是否是引用类型,如果是则继续递归拷贝,如果不是则直接赋值。

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

方法三:使用第三方库

除了手动实现深拷贝外,也可以使用第三方库来实现深拷贝,例如 lodash 提供了 cloneDeep() 方法,可以深度拷贝对象。使用第三方库的好处是代码更少,更易维护。

import cloneDeep from 'lodash/cloneDeep';

const obj = { foo: 'bar', arr: [{ a: 'b' }] };
const clonedObj = cloneDeep(obj);
console.log(clonedObj);

示例说明

示例一:深拷贝对象

const obj = {
  name: "张三",
  age: 24,
  skills: ["JavaScript", "CSS", "HTML"],
  education: {
    school: "清华大学",
    major: "计算机科学与技术",
  },
};

const clonedObj = deepClone(obj);
console.log(clonedObj);

运行以上代码,控制台打印结果为:

{
  name: "张三",
  age: 24,
  skills: ["JavaScript", "CSS", "HTML"],
  education: {
    school: "清华大学",
    major: "计算机科学与技术",
  },
}

示例二:深拷贝数组

const arr = [
  {
    id: 1,
    name: "张三",
    age: 24,
  },
  {
    id: 2,
    name: "李四",
    age: 25,
  },
];

const clonedArr = deepClone(arr);
console.log(clonedArr);

运行以上代码,控制台打印结果为:

[
  {
    id: 1,
    name: "张三",
    age: 24,
  },
  {
    id: 2,
    name: "李四",
    age: 25,
  },
]

以上两个示例都展示了深拷贝的使用,深拷贝确保了复制后的新数组或对象与原始数组或对象没有接触点。这种功能可以确保应用程序按预期工作,以便您可以专注于代码本身,而不是处理它的常见问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:javascript深拷贝(deepClone)详解 - Python技术站

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

相关文章

  • PHP+Mysql+jQuery文件下载次数统计实例讲解

    这篇攻略主要介绍如何使用PHP、MySQL和jQuery实现文件下载次数的统计和展示。使用这种方式可以非常方便地统计文件的下载量,并且可以将结果展示在页面上,供用户查看。 准备工作 在开始编写代码之前,我们需要先准备一些工具和资源: PHP环境:确保你的服务器上已经安装了PHP。如果没有安装,可以从官网下载并安装。 MySQL数据库:用于存储下载次数的数据。…

    jquery 2023年5月27日
    00
  • jQWidgets jqxChart padding属性

    以下是关于“jQWidgets jqxChart padding属性”的完整攻略,包含两个示例说明: 简介 jqxChart 控件的 padding 属性是一个非常有用的,它可以图表的内边距。使用 padding 属性,可以方便地调整图表的布局和样式。 细攻略 以下是 jqChart 控件 padding 属性的详细攻略: padding 属性 paddin…

    jquery 2023年5月11日
    00
  • JavaScript实现替换字符串中最后一个字符的方法

    JavaScript中替换字符串中最后一个字符的方法可以使用字符串的slice和substring方法。以下是完整攻略: 使用slice方法 slice 方法可从已有的数组中返回选定的元素。 语法: str.slice(start, end) 参数: start:必需。规定从何处开始选取。如果是负数,则从尾部开始计算。 end:可选。规定从何处结束选取。如果…

    jquery 2023年5月27日
    00
  • JS/jQuery实现DIV延时几秒后消失或显示的方法

    实现DIV延时几秒后消失或显示的方法,可以利用JS或jQuery的定时器来实现。以下是详细的攻略过程: 使用JS实现DIV延时几秒后消失或显示的方法 创建一个定时器,并使用setTimeout()函数来延时执行代码。 在延时执行的代码里,获取需要显示或隐藏的DIV元素。 判断DIV元素是否已经隐藏或显示,可以使用element.style.display属性…

    jquery 2023年5月27日
    00
  • jquery实现手机端单店铺购物车结算删除功能

    以下是“jquery实现手机端单店铺购物车结算删除功能”的完整攻略。 概述 在开发手机端的电商网站时,购物车是必不可少的功能之一。在购物车中,用户可以查看已选择的商品、数量以及价格,还可以执行结算、删除等操作。因此,实现购物车结算删除功能是非常重要的。 本攻略主要介绍如何使用jquery实现手机端单店铺购物车结算删除功能。 实现步骤 下面是实现该功能的详细步…

    jquery 2023年5月27日
    00
  • jQWidgets jqxComboBox animationType 属性

    jQWidgets 的 jqxComboBox 组件提供了 animationType 属性,用于设置下拉列表的动画类型。本文将详细介绍 animationType 属性的使用方法,包括概述、示例以及注意事项。 animationType 属性概述 animationType 属性用于设置下拉列表的动画类型。该属性的值可以是字符串,表示动画类型。 anima…

    jquery 2023年5月11日
    00
  • JQuery对表单元素的基本操作使用总结

    下面是关于“JQuery对表单元素的基本操作使用总结”的完整攻略。 1. JQuery对表单元素的选择 表单元素通常有文本框、下拉列表框、单选框、复选框、文本域等。选择表单元素时需要用到jQuery选择器。 (1)选择表单元素的基本语法 $(“elementSelector”) 其中,“elementSelector”是选择器,用来指定要选取的表单元素。 (…

    jquery 2023年5月28日
    00
  • BootStrap按钮标签及基本样式

    BootStrap 按钮标签及基本样式 在 BootStrap 中,通过按钮标签可以快速地创建按钮并添加预定义的样式,这节将详细介绍 BootStrap 的按钮标签及基本样式。 基本结构 按钮标签的基本结构为: <button class="btn">Button</button> 其中,.btn 类是必须的,它是…

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