javascript深拷贝的几种情况总结

yizhihongxing

JavaScript深拷贝的几种情况总结

在 JavaScript 中,对于对象的赋值,常常会遇到浅拷贝和深拷贝的问题。浅拷贝只复制对象的引用,而深拷贝则是复制对象的值。这篇文章将总结 JavaScript 中深拷贝的几种情况以及对应的实现方法。

基本数据类型

字符串、数值、布尔类型(string, number, boolean)

基本数据类型的深拷贝非常简单,只需要把值赋给新的变量即可。

let str = 'hello';
let num = 123;
let bool = true;

let str2 = str;
let num2 = num;
let bool2 = bool;

以上代码中,str2num2bool2 分别是 strnumbool 的深拷贝。

null 和 undefined

nullundefined 是 JavaScript 中的特殊值,它们并不是对象,也不是基本数据类型,因此没有值可以深拷贝。

引用数据类型

数组(Array)

对于数组的深拷贝,可以使用 Array.from() 或者 spread operator

let arr = [1, 2, 3];

let arr2 = Array.from(arr);
let arr3 = [...arr];

以上代码中,arr2arr3 分别是 arr 的深拷贝。

对象(Object)

对于对象的深拷贝,可以使用 JSON.parse(JSON.stringify()),但是要注意该方法会忽略对象中的函数、undefinedsymbol 等。

let obj = {
  name: 'Alice',
  age: 18,
  children: [
    {
      name: 'Bob',
      age: 1,
    },
    {
      name: 'Charlie',
      age: 2,
    },
  ],
};

let obj2 = JSON.parse(JSON.stringify(obj));

以上代码中,obj2obj 的深拷贝。

自定义对象

对于自定义对象,可以通过递归实现深拷贝。

function deepCopy(obj) {
  if (typeof obj !== 'object' || obj === null) {
    return obj;
  }

  let result;

  if (Array.isArray(obj)) {
    result = [];
  } else {
    result = {};
  }

  for (let key in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, key)) {
      result[key] = deepCopy(obj[key]);
    }
  }

  return result;
}

let obj = {
  name: 'Alice',
  age: 18,
  children: [
    {
      name: 'Bob',
      age: 1,
    },
    {
      name: 'Charlie',
      age: 2,
    },
  ],
};

let obj2 = deepCopy(obj);

以上代码中,obj2obj 的深拷贝。

示例说明

示例一

let obj = {
  name: 'Alice',
  age: 18,
  friends: {
    name: 'Bob',
    age: 19,
  },
};

let obj2 = JSON.parse(JSON.stringify(obj));
obj2.friends.age = 20;

console.log(obj);   // { name: 'Alice', age: 18, friends: { name: 'Bob', age: 19 } }
console.log(obj2);  // { name: 'Alice', age: 18, friends: { name: 'Bob', age: 20 } }

在以上代码中,objobj2 都是对象,通过 JSON.parse(JSON.stringify()) 实现深拷贝。但是,当我们改变 obj2.friends.age 的值时,obj 的值不会受到影响,这说明 JSON.parse(JSON.stringify()) 并不是完全的深拷贝。

示例二

let arr = [
  {
    name: 'Alice',
    age: 18,
  },
  {
    name: 'Bob',
    age: 19,
  },
];

let arr2 = Array.from(arr);
arr2[0].age = 20;

console.log(arr);   // [ { name: 'Alice', age: 18 }, { name: 'Bob', age: 19 } ]
console.log(arr2);  // [ { name: 'Alice', age: 20 }, { name: 'Bob', age: 19 } ]

在以上代码中,arrarr2 都是数组,通过 Array.from() 实现深拷贝。但是,当我们改变 arr2[0].age 的值时,arr 的值也会发生变化,这说明 Array.from() 并不是完全的深拷贝。

注意以上两个示例在深拷贝过程中的缺陷,应该根据具体情况选择合适的深拷贝方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:javascript深拷贝的几种情况总结 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • vue 手机物理监听键+退出提示代码

    下面我就为大家详细讲解如何实现“vue 手机物理监听键+退出提示代码”。 步骤一:安装依赖和引入插件 首先,我们需要先安装依赖和引入插件。安装依赖可以使用npm或yarn进行安装,本教程使用yarn作为示例(前提是你已经通过npm安装了yarn) yarn add vue-router@latest yarn add -D @vue/cli-plugin-b…

    JavaScript 2023年6月11日
    00
  • javascript加号”+”的二义性说明

    当我们在JavaScript中使用加号 + 时,它具有两种不同的作用:数学加法和字符串拼接。这种情况被称为“加号的二义性”。 数学加法 当加号 + 作为两个数字之间的运算符使用时,它执行数学加法操作: const num1 = 5; const num2 = 10; const sum = num1 + num2; console.log(sum); // …

    JavaScript 2023年5月28日
    00
  • js按指定格式显示日期时间的样式代码

    下面我将详细讲解如何用 JavaScript 按指定的格式显示日期时间样式的代码攻略。 1. 获取当前的日期和时间 在编写代码显示日期和时间之前,我们需要先获取当前的日期和时间信息。这个过程可以通过 JavaScript 的内置对象 Date 来实现,如下所示: var now = new Date(); 这里定义了一个名为 now 的变量,并通过 new …

    JavaScript 2023年5月27日
    00
  • JavaScript数组方法-系统性总结详解

    JavaScript数组方法-系统性总结详解 概述 数组(Array)是JavaScript中最常用、最重要的一种数据类型,而且在实际开发中,我们也经常需要对数组进行各种操作,比如查询、增加、删除、排序等等。JavaScript提供了很多数组方法,让我们能够方便快捷的对数组进行各种操作,使得开发变得更加高效。本篇文章旨在对JavaScript数组方法进行系统…

    JavaScript 2023年5月18日
    00
  • 详解javascript事件冒泡

    详解JavaScript事件冒泡攻略 在JavaScript中,事件冒泡是指当一个元素触发了某个事件时,该事件将传递到该元素的祖先元素,一直到HTML文档的根节点。这意味着如果您不阻止事件冒泡,那么在触发最底层元素的事件时,将触发所有父元素的事件。在本教程中,我们将详细讨论Javascript事件冒泡和如何在代码中实现它。 什么是事件冒泡 事件冒泡是一种机制…

    JavaScript 2023年6月10日
    00
  • uniapp使用navigateBack方法返回上级页面并刷新的简单示例

    下面我将详细讲解“uniapp使用navigateBack方法返回上级页面并刷新的简单示例”的完整攻略。 1. navigateBack方法是什么? navigateBack是uniapp中的导航API之一,用来返回上一页。当你在一个页面中进行跳转到另外一个页面时,可以使用navigateTo方法来进行跳转,然后在跳转后的页面中通过navigateBack方…

    JavaScript 2023年6月11日
    00
  • JS+HTML5 FileReader对象用法示例

    以下是JS+HTML5 FileReader对象用法示例的完整攻略: 简介 JavaScript通过FileReader对象可以实现文件读取操作,这个功能可以很好地满足一些特殊业务需求,例如上传文件时,需要对文件做一些特殊处理或者读取文件中某些数据进行操作等。 FileReader API FileReader API主要包括以下四个方法: readAsBi…

    JavaScript 2023年5月27日
    00
  • java控制Pdf自动打印的小例子

    针对Java控制Pdf自动打印的小例子,下面是完整攻略及示例说明。 1. 背景介绍 在实际工作中,我们经常需要将电子文档打印出来,而Pdf是一种较为常用的电子文档格式。通过Java控制Pdf自动打印,可以提高打印效率、减少人工干预,特别是在需要批量打印的情况下,这种技术能够大大提高工作效率。 2. 实现步骤 2.1 使用iText库 要实现Java控制Pdf…

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