js 深拷贝函数

yizhihongxing

当我们需要对一个 JavaScript 对象进行复制或者赋值操作时,通常会遇到一个问题:当我们仅仅对该对象进行简单的赋值时,实际上我们并没有将其作为一个全新的对象重新创建一份,而是在实际上仅仅对原有对象进行了一份引用。由此,如果我们修改了其中一个引用,那么其他的引用也将受到影响。因此,为了避免这种问题,我们需要使用深拷贝函数来创建一个全新的对象。本文将会提供一个深拷贝函数的完整攻略。

深拷贝函数的基本概念

深拷贝本质上是一种递归调用的算法,该算法会先判断传递进来的参数数据类型是什么,然后再根据参数的数据类型继续执行寻找每一层对象;并且一旦发现其中存在嵌套的对象时,该算法会递归地进行操作。

深拷贝函数的实现

下面是一个 JavaScript 实现的深拷贝算法:

function deepClone(source) {
  if (!source || typeof source !== "object") {
    throw new Error("请传入一个对象数据类型参数!");
  }

  let cloneObj = Array.isArray(source) ? [] : {};

  for (let key in source) {
      if(source.hasOwnProperty(key)){
      if (source[key] && typeof source[key] === "object") {
        cloneObj[key] = deepClone(source[key]);
      } else {
        cloneObj[key] = source[key];
      }
    }
  }

  return cloneObj;
}

在这个实现中,我们首先需要定义一个函数 deepClone() 来实现深拷贝的操作。这个函数的第一个参数是要进行拷贝操作的对象,而第二个参数是一个可选的布尔值,当其为 true 时,会禁止使用 Object.create() 来拷贝该对象。

在代码内部,我们首先判断参数类型是否正确,然后再根据不同的情况进行操作。当参数的类型为数组类型时,拷贝操作的目标是一个数组,在代码内部,我们通过判断参数对象的数据类型来决定目标数据类型是 {} 还是 []。在代码的后续操作中,我们同样会递归地处理其中包含的每一项数据。

深拷贝函数的使用

下面将提供两个深拷贝函数使用的示例:

示例一:

let sales = {
  Peter: { apple: 20, peach: 28, banana: 25 },
  Mary: { apple: 34, peach: 29, banana: 48 },
  John: { apple: 10, peach: 34, banana: 100 }
};

let cloneSales = deepClone(sales);

console.log(sales === cloneSales); // false

console.log(cloneSales.Peter); // { apple: 20, peach: 28, banana: 25 }

在这个示例中,我们首先创建了一个对象 sales,它包含了三个人的销售数量。然后,我们将该对象传递给我们的 deepClone() 函数进行深拷贝操作。在代码的最后,我们会打印 sales === cloneSales,注意这两个对象的地址是不同的。此外,我们也会验证 cloneSales.Peter 是否和 sales.Peter 是相等的。

示例二:

let arr = [1, 2, 3, 4, { name: "Tom", age: 20 }];

let cloneArr = deepClone(arr);

console.log(arr === cloneArr); // false

console.log(cloneArr[4].name); // Tom

在这个示例中,我们首先创建了一个数组 arr,其中包含了数字和一个包含名字和年龄的对象。然后,我们将该数组传递给我们的 deepClone() 函数进行深拷贝操作。在代码的最后,我们会打印 arr === cloneArr,注意这两个数组的地址是不同的。此外,我们也会打印 cloneArr[4].name 来验证其中包含的是否是原来的Tom。

通过对这两个示例的讲解,我们可以理解深拷贝函数的实现和使用方法。深拷贝函数避免了引用传递时的错误,同时在对象复制方面也极为实用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js 深拷贝函数 - Python技术站

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

相关文章

  • Javascript Array pop 方法

    以下是关于JavaScript Array pop方法的完整攻略。 JavaScript Array pop方法 JavaScript Array pop方法用于从数组中删除最后一个元素,并返回该元素的值。该方法会改变原始数组,删除最后一个元素,原始数组的长度会减少1。 下面是一个使用pop方法的示例: var arr = [1, 2, 3]; consol…

    JavaScript 2023年5月11日
    00
  • 详解javaScript中Number数字类型的使用

    详解JavaScript中Number数字类型的使用 在JavaScript中,Number数字类型表示数字。在本文中,我们将详细讨论JavaScript中的Number数字类型,包括Number的类型、创建Number变量的方法、数字类型的方法和常见问题以及示例说明。 Number类型和创建Number变量的方法 在JavaScript中,Number是一…

    JavaScript 2023年5月28日
    00
  • 通过实例了解JS执行上下文运行原理

    JS执行上下文(execution context)是JS解释器在处理JS代码时,创建的一个对象,用来管理和维护当前代码的执行环境,包括当前作用域内的变量、函数声明、this指向和外部环境等相关信息。本文将通过两条实例,来深入了解JS执行上下文的运行原理。 执行上下文的创建过程 在JS解释器执行JS代码之前,首先会创建一个全局上下文(Global Execu…

    JavaScript 2023年6月10日
    00
  • 实现javascript的延期执行或者重复执行的两个函数

    实现 JavaScript 的延期执行或重复执行,常用两个函数:setTimeout 和 setInterval。以下是详细攻略: setTimeout setTimeout 函数可以延迟指定时间后执行一次函数。 该函数的第一个参数是要执行的函数或要执行的代码,第二个参数是需要延迟的时间,单位是毫秒。 setTimeout 函数返回一个 ID,我们可以通过该…

    JavaScript 2023年6月10日
    00
  • JS实现动画中的布局转换

    JS实现动画中的布局转换可以通过以下步骤完成: 选择需要转换布局的元素:使用JavaScript的DOM操作选择需要进行布局转换的元素,可以通过ID、class或标签名来选择。 设计转换效果:通过CSS或JavaScript来设置需要进行的布局转换效果,例如平移、缩放、旋转等。 绑定事件:通过JavaScript来绑定需要触发布局转换效果的事件,例如鼠标移入…

    JavaScript 2023年6月10日
    00
  • 深浅拷贝,温故知新

    1、深拷贝 1.1、概念 对象的深拷贝是指其属性与其拷贝的源对象的属性不共享相同的引用(指向相同的底层值)的副本。 因此,当你更改源或副本时,可以确保不会导致其他对象也发生更改;也就是说,你不会无意中对源或副本造成意料之外的更改。 在深拷贝中,源和副本是完全独立的。深拷贝与其源对象不共享引用,所以对深拷贝所做的任何更改都不会影响源对象。 1.2、实现方式: …

    JavaScript 2023年5月11日
    00
  • js实现下载(文件流式)方法详解与完整实例源码

    首先,需要明确一点,下载文件大多数情况下需要后端接口进行配合,前端只需要向后端发起下载请求即可。本文介绍的js实现文件下载,是通过向后端接口发起请求获取文件流,再通过js实现文件的下载。 如何下载文件 实现文件下载的方式有很多,其中一种较为简单的方式是使用a标签进行下载。例如: <a href="http://example.com/file…

    JavaScript 2023年5月27日
    00
  • js事件on动态绑定数据,绑定多个事件的方法

    JavaScript中的事件机制是常见的Web前端开发基础,通过on事件可以实现动态绑定事件,并绑定多个事件,以下是详细的攻略: 1. on动态绑定数据 on事件可以通过DOM元素的属性方式进行设置,同时这个属性名称也必须遵循on开头的规则,如onclick、onload等。此外,我们还可以利用JavaScript的编程方式来实现事件的绑定。 以下是一个基本…

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