JavaScript 中对象的深拷贝

yizhihongxing

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日

相关文章

  • js实现iGoogleDivDrag模块拖动层拖动特效的方法

    JS实现iGoogleDivDrag模块拖动层拖动特效是一项基于鼠标拖动功能的JavaScript特效。下面是实现该特效的攻略: 1. 添加HTML结构 首先,在HTML中添加需要拖拽的div元素,同时为目标div元素指定ID属性,例如: <div id="dragElement">需要拖拽的内容区域</div> …

    JavaScript 2023年6月11日
    00
  • javascript异步编程的六种方式总结

    JavaScript异步编程的六种方式总结 随着现代Web应用程序变得越来越复杂,异步编程成为了必不可少的开发模式。在JavaScript中,我们可以通过多种方式来实现异步编程。本文将介绍JavaScript中的六种常见方式来处理异步编程。 1. 回调函数 回调函数是这六种方式中应用最广泛的一种方式。回调函数是将一个函数作为参数传递给另一个函数,在异步操作完…

    JavaScript 2023年5月27日
    00
  • javascript面向对象三大特征之继承实例详解

    JavaScript面向对象三大特征之继承实例详解 在JavaScript中,继承是面向对象编程的一个重要概念。继承可以方便地重用已有代码,并且可以减少代码重复。本文将解释JavaScript中继承的三种方式,并提供详细的示例说明。 继承的三种方式 在JavaScript中,继承有三种方式: 原型继承 (prototype inheritance) 构造函数…

    JavaScript 2023年5月27日
    00
  • JavaScript学习笔记之DOM基础操作实例小结

    JavaScript(JS)是一种广泛使用的脚本语言,常用于网页设计与动态交互效果实现。DOM(Document Object Model)文档对象模型是JS操作网页中HTML元素和样式的接口。掌握DOM基础操作是学习JS的重要一步,本文将为你介绍如何使用DOM对网页进行修改操作。 1. 加载HTML和JS 在HTML文件中引入JS,然后再通过documen…

    JavaScript 2023年6月10日
    00
  • JS函数节流和防抖之间的区分和实现详解

    JS函数节流和防抖是前端开发中常用的优化技巧,以有效降低网页在滚动或者拖拽等交互操作时因为事件处理函数过多而造成的页面卡顿和性能问题。两者的实现方式也有所区别,本文将结合示例详细讲解它们之间的区分和实现方法。 什么是JS函数节流? JS函数节流指的是在一段时间内,无论触发多少次函数,只执行一次。也就是说,在执行函数的时间间隔内,不管触发了多少次函数,只有一次…

    JavaScript 2023年6月11日
    00
  • JavaScript实现简单计时器

    当需要实现一个简单的计时器时,我们可以使用JavaScript来实现。下面是实现一个简单计时器的步骤和代码示例: 步骤一:创建HTML文件 首先,我们需要创建一个HTML文件,其中包含一个计时器及其按钮。代码如下: <!DOCTYPE html> <html> <head> <title>JavaScript计…

    JavaScript 2023年5月27日
    00
  • JavaScript中style.left与offsetLeft的使用及区别详解

    接下来我将为大家详细讲解“JavaScript中style.left与offsetLeft的使用及区别详解”。 什么是style.left和offsetLeft style.left和offsetLeft都是在JavaScript中用于操作HTML元素的属性。其中,style.left用于获取或设置一个元素的水平偏移量,而offsetLeft则用于获取元素相…

    JavaScript 2023年6月11日
    00
  • JS实现网页标题栏显示当前时间和日期的完整代码

    下面我为你讲解一下 JS 实现网页标题栏显示当前时间和日期的完整代码攻略。 首先,我们需要了解两个 Javascript 方法:setInterval() 和 toLocaleTimeString()。 setInterval() 方法会以指定的时间间隔(以毫秒为单位)重复调用某个函数。可用于创建定期执行的函数(也称为时间间隔函数)。 toLocaleTim…

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