JavaScript 中对象的深拷贝

JavaScript 中对象的深拷贝是一个非常常见且实用的问题。对象的深拷贝是指在拷贝对象时,同时也将其内部所有子对象进行拷贝,而不仅仅是拷贝对象本身。

通常我们在进行拷贝时会用到 JSON 序列化,也可以使用递归等方式进行深拷贝。

下面将通过以下步骤来讲解对象的深拷贝:

1. 判断其类型

在进行深拷贝时,首先要判断要拷贝的对象是什么类型。其中分为两种情况:

  • 要拷贝的是基础类型:不需要进行深拷贝,可以进行浅拷贝。
  • 要拷贝的是对象类型:需要进行深拷贝。

判断方法如下:

function isObject(obj) {
  return typeof obj === 'object' && obj !== null;
}

2. 使用递归进行深拷贝

递归是进行深拷贝的一种常用方式。它通过遍历对象内部所有属性,并递归调用深拷贝函数,实现对整个对象的深度拷贝。

代码实例:

function deepClone(source) {
  if (!isObject(source)) {
    return source;
  }

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

  for (let key in source) {
    if (Object.prototype.hasOwnProperty.call(source, key)) {
      if (isObject(source[key])) {
        target[key] = deepClone(source[key]);
      } else {
        target[key] = source[key];
      }
    }
  }

  return target;
}

示例

下面给出两个示例,来说明对象的深拷贝:

// 示例一
const originalObj = {
  a: 'hello',
  b: {
    c: 'world'
  }
};

// 对 originalObj 进行深拷贝
const newObj = deepClone(originalObj);

// 修改拷贝后的 newObj
newObj.a = 'hi';
newObj.b.c = 'everybody';

// 输出结果
console.log(originalObj); // 输出 {a: "hello", b: {c: "world"}}
console.log(newObj); // 输出 {a: "hi", b: {c: "everybody"}}


// 示例二
const originalArr = [1, {a: 2}, [3, 4]];

// 对 originalArr 进行深拷贝
const newArr = deepClone(originalArr);

// 修改拷贝后的 newArr
newArr[0] = 10;
newArr[1].a = 20;
newArr[2][0] = 30;

// 输出结果
console.log(originalArr); // 输出 [1, {a: 2}, [3, 4]]
console.log(newArr); // 输出 [10, {a: 20}, [30, 4]]

可以看到,在两个示例中,深拷贝函数成功地将原始对象进行了拷贝,并且新对象与原始对象互不影响。

通过以上两个示例,可以看出对象深拷贝的实现方法及其重要性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript 中对象的深拷贝 - Python技术站

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

相关文章

  • ES6变量赋值和基本数据类型详解

    ES6变量赋值和基本数据类型详解 ES6变量赋值 let 和 const 在ES6引入了两个新的关键字let和const来声明变量,与ES5中的var不同的是,let和const声明的变量具有块级作用域。 let用来声明可变的变量,可以在同一作用域中多次进行赋值操作: let a = 1; a = 2; const用来声明不可变的变量,只能在声明时赋值,一旦…

    JavaScript 2023年6月10日
    00
  • js 面向对象学习笔记

    关于JS面向对象的学习,我们可以分为以下步骤: 1. 了解什么是面向对象编程 面向对象编程(OOP)是一种编程范式或编程风格,其主要思想是通过类和实例来描述和组织代码,将数据和行为封装在对象内部,对外提供接口进行访问和操作。 2. 学习面向对象的基本术语 在 OOP 中,有以下基本概念需要了解: 类(Class):定义对象的属性和方法的蓝图 对象(Objec…

    JavaScript 2023年5月18日
    00
  • JS简单获取当前日期和农历日期的方法

    当我们需要在网页中展示当前日期时,可以使用JavaScript来获取当前日期。而获取农历日期则需要用到一些计算方法。下面,我们就来介绍一下JS简单获取当前日期和农历日期的方法。 获取当前日期 方法一:使用Date对象 Date对象是JavaScript中用来处理日期和时间的对象。获取当前日期可以通过创建一个Date对象,并调用其方法来获取。以下是获取当前日期…

    JavaScript 2023年5月27日
    00
  • 跟我学习javascript的全局变量

    下面是详细的攻略。 跟我学习JavaScript的全局变量 什么是全局变量 全局变量就是定义在全局作用域内的变量,可以在代码的任何地方被访问到。无论在哪个函数内或者是代码的外部,我们都可以访问及操作它。 在全局作用域内声明变量 在全局作用域内声明变量有两种方式: 使用var关键字 javascript var globalVar = “This is a g…

    JavaScript 2023年6月10日
    00
  • Js遍历键值对形式对象或Map形式的方法

    当我们需要遍历键值对形式的对象或Map时,可以使用JavaScript中的for…in循环和forEach方法。 for…in循环 for…in循环可以遍历对象和Map中的所有键值对,格式如下: for(var key in obj/map) { // 对每个键值对进行操作 } 其中,key是对象/Map中的每个键,obj/map是我们需要遍历的…

    JavaScript 2023年5月27日
    00
  • ExtJs的Date格式字符代码

    以下是“ExtJs的Date格式字符代码”的完整攻略。 一、什么是Date格式字符代码? 在ExtJs中,Date类是与日期和时间相关的一个重要类。在将日期或时间数据格式化为字符串时,需要使用Date格式字符代码。Date格式字符代码是指日期/时间格式字符串中的特殊字符代码,用于表示日期或时间的各个部分。常见的Date格式字符代码包括年份、月份、日期、星期、…

    JavaScript 2023年6月10日
    00
  • Vue Element前端应用开发之表格列表展示

    下面是“Vue Element前端应用开发之表格列表展示”的完整攻略。 1. 前提条件 在开始使用Vue Element框架进行表格列表展示的开发前,需要确保你已经安装了以下环境和工具: Node.js Vue.js Vue Element UI 2. 搭建Vue Element应用 使用Vue CLI创建一个新的Vue Element应用,如下所示: vu…

    JavaScript 2023年6月10日
    00
  • JS库之Particles.js中文开发手册及参数详解

    首先,”JS库之Particles.js中文开发手册及参数详解”是一篇介绍Particles.js库的文章,该库可以用于在网页中生动呈现粒子效果,如雨、雪、烟雾等,从而增强网页的视觉效果。下面我们就来详细讲解一下这篇文章的完整攻略。 一、简介 首先,在文章的简介部分,作者简要介绍了Particles.js库的特点和优势,同时引用了该库的GitHub开源地址,…

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