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日

相关文章

  • jquery判断输入密码两次是否相等

    在jQuery中,可以通过以下方式判断输入密码两次是否相等。 前置条件 网页已经引用了jQuery库 方法1:使用.val()方法获取输入框值 以下是代码示例: // 获取输入框中的密码值 var password1 = $(‘#password1’).val(); var password2 = $(‘#password2’).val(); // 判断两次…

    jquery 2023年5月27日
    00
  • jQuery图片查看插件Magnify开发详解

    jQuery图片查看插件Magnify开发详解 介绍 Magnify是一个简单易用的jQuery图片查看插件,可以放大和缩小图片,也可以通过拖拽方式移动图片位置。使用该插件,可以提高网站图片浏览的体验。 使用方法 引入jQuery和Magnify的js和css文件。 html<script src=”jquery.min.js”></scr…

    jquery 2023年5月27日
    00
  • jQWidgets jqxPivotGrid selectionEnabled属性

    以下是关于 jQWidgets jqxPivotGrid 组件中 selectionEnabled 属性的详细攻略。 jQWidgets jqxPivotGrid selectionEnabled 属性 jQWidgets jqxPivotGrid 组件的 selectionEnabled 属性用于启用或禁用数据透视表中的项的选择功能。当该属性设置为 tru…

    jquery 2023年5月12日
    00
  • jquery如何把数组变为字符串传到服务端并处理

    将数组转换为字符串并传递到服务端处理,通常有两种方式: 方式一:将数组转换为JSON字符串 利用JSON.stringify()将数组转换为JSON格式的字符串。 javascript var arr = [‘苹果’, ‘梨子’, ‘香蕉’]; var arrStr = JSON.stringify(arr); // 将数组[‘苹果’, ‘梨子’, ‘香蕉’…

    jquery 2023年5月27日
    00
  • jQWidgets jqxGrid clearfilters()方法

    以下是关于“jQWidgets jqxGrid clearfilters()方法”的完整攻略,包含两个示例说明: 简介 jqxGrid 控件的 clearfilters() 方法用于清除控件中的筛选器。 整攻略 以下是 jqxGrid 控件 clearfilters() 方法的完整攻略: 调用 clearfilters() 方法 $("#jqxgr…

    jquery 2023年5月10日
    00
  • jquery异步调用页面后台方法‏(asp.net)

    当我们在ASP.NET页面中要调用后台方法时,通常会使用jQuery来进行异步调用。下面是一个完整的攻略,详细讲解如何进行jQuery异步调用后台方法。 准备工作 在使用jQuery异步调用后台方法之前,我们需要先做一些准备工作。具体包括以下几个方面: 引用jQuery框架:在页面中引用jQuery框架,可以使用CDN或者本地引用。 html<scri…

    jquery 2023年5月28日
    00
  • jQWidgets jqxGrid columnsmenu属性

    以下是关于“jQWidgets jqxGrid columnsmenu属性”的完整攻略,包含两个示例说明: 简介 jqxGrid 控件的 columnsmenu 属性用于定义表格列菜单的相关设置。 完整攻略 以下是 jqxGrid 控件 columnsmenu 属性的完整攻略: 定义 columnsmenu 属性 在 jqxGrid 控件中,可以使用 col…

    jquery 2023年5月11日
    00
  • jQuery中deferred对象使用方法详解

    jQuery中Deferred对象使用方法详解 在jQuery中,Deferred对象是一种非常重要的概念,它可以帮助我们更好地管理异步操作。本文将详细讲解Deferred对象的使用方法。 Deferred对象介绍 Deferred对象可以看作是在jQuery中处理异步任务的一个工具。它提供了一些方法可以让我们更便捷地处理异步操作,比如: 通过done()方…

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