JavaScript深拷贝的几种实现方法实例

  1. 为什么需要深拷贝?

在 JavaScript 中,对象和数组是通过引用赋值的方式传递的。如果直接将一个对象或数组赋值给另一个变量,那么这两个变量其实指向的是同一个对象或数组。因此,如果修改其中一个变量所指向的对象或数组的值,那么另一个变量也会受到影响。这就是浅拷贝的特点。为了避免这种情况的发生,我们需要进行深拷贝,即创建一个新的对象或数组,其中所有的值都是原来对象或数组中的值的副本,互不相干。

  1. 深拷贝的几种实现方式

2.1 手动递归实现

最原始的实现方式就是手动递归复制,代码如下所示:

function deepClone(obj) {
  // 首先判断对象是否为null或者不是对象、数组类型
  if (obj === null || typeof obj !== 'object') {
    return obj;
  }

  // 根据obj的类型创建一个对应的空对象或数组
  const newObj = Array.isArray(obj) ? [] : {};

  // 遍历obj的所有属性,递归复制
  for (const key in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, key)) {
      newObj[key] = deepClone(obj[key]);
    }
  }

  return newObj;
}

2.2 使用JSON.stringify和JSON.parse

这种方式是将对象转换成JSON字符串,再将JSON字符串转换回对象。这种方法虽然简单,但不能处理函数、undefined、RegExp等特殊类型数据。同时,属性中的循环引用也会导致错误。

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

2.3 使用lodash库

Lodash库是一个非常流行的JavaScript工具库,其中包含了深拷贝函数cloneDeep,使用很方便。

const _ = require('lodash');

function deepClone(obj) {
  return _.cloneDeep(obj);
}
  1. 示例演示

3.1 手动递归实现示例

const obj = {
  name: 'Tom',
  age: 20,
  shape: {
    weight: 70,
    height: 180,
  },
  hobbies: ['reading', 'running'],
};

const newObj = deepClone(obj);

newObj.name = 'Jerry';
newObj.shape.weight = 65;
newObj.hobbies.push('cycling');

console.log(obj);
console.log(newObj);

输出结果如下:

{
  name: 'Tom',
  age: 20,
  shape: { weight: 70, height: 180 },
  hobbies: [ 'reading', 'running', 'cycling' ]
}
{
  name: 'Jerry',
  age: 20,
  shape: { weight: 65, height: 180 },
  hobbies: [ 'reading', 'running', 'cycling' ]
}

可以看出,修改newObj中的属性并不会影响到原来的obj对象。

3.2 JSON.stringify和JSON.parse示例

const obj = {
  name: 'Tom',
  age: 20,
  shape: {
    weight: 70,
    height: 180,
  },
  hobbies: ['reading', 'running'],
};

const newObj = deepClone(obj);

newObj.name = 'Jerry';
newObj.shape.weight = 65;
newObj.hobbies.push('cycling');

console.log(obj);
console.log(newObj);

输出结果如下:

{
  name: 'Tom',
  age: 20,
  shape: { weight: 70, height: 180 },
  hobbies: [ 'reading', 'running' ]
}
{
  name: 'Jerry',
  age: 20,
  shape: { weight: 65, height: 180 },
  hobbies: [ 'reading', 'running', 'cycling' ]
}

同样可以看出,修改newObj中的属性并不会影响到原来的obj对象。

综上所述,每种实现方式都有自己的优缺点,具体使用要根据场景需求进行选择。如果需要更加高效的深拷贝实现,则可以使用immutable.js等工具库。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript深拷贝的几种实现方法实例 - Python技术站

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

相关文章

  • 理解Javascript_07_理解instanceof实现原理

    理解Javascript_07_理解instanceof实现原理 在Javascript中,我们可以使用instanceof操作符来判断一个对象是否属于某个类或者构造函数的实例。这是一个非常常见的操作,经常用于判断一个对象的类型。在本篇攻略中,我们将深入探讨instanceof的实现原理,以及如何使用它来判断一个对象的类型。 instanceof的作用 in…

    JavaScript 2023年5月28日
    00
  • 帮助避免错误的Javascript陷阱清单

    下面我将为你详细讲解“帮助避免错误的Javascript陷阱清单”的完整攻略。 理解Javascript陷阱及其原因 Javascript 语言中存在很多陷阱,这些陷阱可能会导致意外的行为,或者让你的程序出现错误。因此,我们需要了解它们并且避免它们。 Javascript 陷阱主要来源于三个方面: Javascript 语言本身的设计缺陷; 语言规范中的歧义…

    JavaScript 2023年5月28日
    00
  • 原生JS实现LOADING效果

    原生JS实现LOADING效果的攻略包括以下步骤: 1.准备DOM结构和CSS样式 首先要在HTML中添加一个包含一个loader的div元素,用于显示LOADING效果。如下所示: <div id="loader"></div> 然后我们需要为这个loader div元素设置样式。样式可以按照自己的需要进行修改,…

    JavaScript 2023年6月11日
    00
  • javaScript语法总结

    JavaScript语法总结 1. 变量与数据类型 JavaScript的数据类型分为基本数据类型和引用数据类型。基本数据类型包括数字、字符串、布尔值、null和undefined,引用数据类型包括对象、数组和函数。 1.1 变量的声明 在JavaScript中,通过 var、let、const 关键字声明一个变量。 var 声明的变量为函数作用域,let …

    JavaScript 2023年5月17日
    00
  • 一起来了解javascript数组的方法

    下面是“一起来了解javascript数组的方法”的完整攻略: 一、介绍 JavaScript数组是一种万能的数据结构,它们充满了各种有用的操纵方法和属性。这里我们将探索一些我们最喜欢的方法和属性,解释它们是如何工作的,并展示如何使用它们。 二、数组的基本操作 1. 创建数组 在JavaScript中,有各种不同的方式可以创建Array。以下是几种常见的方式…

    JavaScript 2023年5月27日
    00
  • asp.net通过js实现Cookie创建以及清除Cookie数组的代码

    ASP.NET是一个Web应用程序框架,通过JavaScript可以创建Cookie并清除Cookie数组。下面是实现Cookie创建和清除Cookie数组的示例代码: 创建Cookie 要在ASP.NET网站中创建Cookie,我们可以使用JavaScript的document.cookie属性。下面是创建一个名为MyCookie,值为123的Cookie…

    JavaScript 2023年6月11日
    00
  • javascript中encodeURI和decodeURI方法使用介绍

    JavaScript 中 encodeURI 和 decodeURI 方法使用介绍 在 JavaScript 中,encodeURI 和 decodeURI 方法可以用于编码和解码 URI,以便在 URL 中传输特殊字符或非 ASCII 字符。本文将详细介绍这两种方法的使用。 encodeURI 方法 encodeURI 可以将 URL 中除了 字母、数字、…

    JavaScript 2023年5月19日
    00
  • 带你了解JavaScript的运行原理

    带你了解JavaScript的运行原理 JavaScript是什么 JavaScript 是一种轻量级的编程语言,被广泛应用于 Web 开发中。它被用来为实现交互性的特效和动态网页功能,如表单验证、下拉菜单、页面滑动等等提供动力。现在,JavaScript 还可以被用来开发桌面和移动应用,以及服务器端应用。 JavaScript 运行原理 在了解 JavaS…

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