JavaScript浅层克隆与深度克隆示例详解

下面是详细讲解“JavaScript浅层克隆与深度克隆示例详解”的完整攻略。

什么是克隆?

在 JavaScript 中,克隆是指将一个对象(或数组)的所有属性(或元素)复制到另一个对象(或数组)中。克隆的主要目的是防止对原对象的修改影响到其他对象。在一些特定的场景下,克隆还可以用于混淆对象结构以保证数据的安全性。

JavaScript 中的克隆分为两种:浅层克隆和深度克隆。

浅层克隆

浅层克隆是指将原对象的所有属性复制到新对象中,但是如果原对象属性的值是对象或数组,则只是复制了它的引用。这意味着当原对象属性的值对象被修改时,克隆对象对应属性的值也会发生变化。

以下是一个浅层克隆的示例:

let obj1 = {
  name: 'Jane',
  age: 20,
  address: {
    city: 'Beijing',
    district: 'Haidian'
  }
};

let obj2 = Object.assign({}, obj1);

在这个示例中,Object.assign 方法将 obj1 的所有属性复制到一个新的对象 obj2 中。现在我们来修改 obj1.address.city 的值,然后查看 obj2

obj1.address.city = 'Shanghai';

console.log(obj2.address.city); // 输出 'Shanghai'

可以发现,当我们修改 obj1.address.city 的值时,obj2.address.city 的值也随之修改了。这是因为浅层克隆只复制了 obj1.address 对象的引用,而不是这个对象本身。

深度克隆

深度克隆与浅层克隆最大的不同在于,它会递归地复制原对象的所有属性,包括属性值是对象或数组的情况,直到所有属性的值都不是对象或数组为止。这样,即使修改原对象属性值的引用,克隆对象对应属性的值也不会发生变化。

以下是一个深度克隆的示例:

function deepClone(obj) {
  let newObj = Array.isArray(obj) ? [] : {};

  for (let key in obj) {
    if (typeof obj[key] === 'object' && obj[key] !== null) {
      newObj[key] = deepClone(obj[key]);
    } else {
      newObj[key] = obj[key];
    }
  }

  return newObj;
}

let obj1 = {
  name: 'Jane',
  age: 20,
  address: {
    city: 'Beijing',
    district: 'Haidian'
  }
};

let obj2 = deepClone(obj1);

在这个示例中,我们自定义了一个 deepClone 函数,使用递归的方式深度复制了 obj1 对象,并将结果保存在一个新的对象 obj2 中。现在我们来修改 obj1.address.city 的值,然后查看 obj2

obj1.address.city = 'Shanghai';

console.log(obj2.address.city); // 输出 'Beijing'

可以发现,当我们修改 obj1.address.city 的值时,obj2.address.city 的值没有随之修改。这是因为深度克隆递归地复制了 obj1.address 对象,而不是这个对象的引用。

结语

以上就是 JavaScript 浅层克隆与深度克隆的详细介绍,希望能对您有所帮助。值得注意的是,深度克隆递归地复制对象结构可能会导致性能问题和内存溢出,因此在实际应用中需要根据具体情况选择合适的克隆方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript浅层克隆与深度克隆示例详解 - Python技术站

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

相关文章

  • Js视频播放器插件Video.js使用方法详解

    Js视频播放器插件Video.js使用方法详解 简介 Video.js是一个开源的JavaScript库,用于在不同的浏览器和设备上播放HTML5视频和音频。它具有许多功能,包括自定义外观,广告插入,播放列表,字幕和音频曲目等。 在本篇教程中,我们将详细介绍Video.js的使用方法,并提供一些示例说明。 安装 首先,你需要从Video.js官网下载库文件。…

    JavaScript 2023年6月11日
    00
  • 彻底弄懂 JavaScript 执行机制

    彻底弄懂 JavaScript 执行机制 JavaScript 的执行环境 JavaScript 代码的执行必须依赖一个执行环境,该执行环境可以是浏览器、 Node.js 服务器或其它解释器等等,而这些执行环境会为 JavaScript 提供几乎相同的对象和方法,但是在细节上或许会略有不同。 JavaScript 的执行过程 JavaScript 的执行过程…

    JavaScript 2023年5月28日
    00
  • JS实现视频弹幕效果

    下面是 JS 实现视频弹幕效果的完整攻略: 准备工作 首先,我们需要准备好以下两个文件:- 视频文件- 弹幕 JSON 文件 其中,弹幕 JSON 文件应该包含以下字段:- text:弹幕文本内容- time:弹幕出现时间,单位为秒- color:弹幕颜色,可以是颜色代码或颜色名称 实现步骤 在 HTML 中添加视频和画布元素 在 HTML 中添加一个 vi…

    JavaScript 2023年6月10日
    00
  • javascript中比较字符串是否相等的方法

    要比较JavaScript中的两个字符串是否相等,通常可以使用JavaScript提供的严格相等运算符===或Object.is()方法。 使用严格相等运算符 === 严格相等运算符===将比较两个字符串的值和类型。如果两个字符串的值和类型完全相同,则返回true,否则返回false。 以下是使用===运算符比较字符串的示例代码: const str1 = …

    JavaScript 2023年5月28日
    00
  • Javascript之文件操作

    下面是详细讲解JavaScript之文件操作的完整攻略,包括文件的读取、写入、删除等常见操作。 1. 读取文件 1.1 读取本地文件 可以使用FileReader对象读取本地文件。它提供一些方法来读取文件的内容,如readAsArrayBuffer、readAsBinaryString、readAsText、readAsDataURL等。这些方法的参数是一个…

    JavaScript 2023年5月18日
    00
  • JavaScript-定时器0~9抽奖系统详解(代码)

    JavaScript定时器0~9抽奖系统是一种利用定时器生成随机数来模拟抽奖的方法。本文将详细讲解该方法的代码实现和使用过程。 代码实现说明 HTML结构 首先,我们需要在HTML中写入一个包含数字0~9的列表。每个数字都应该有一个特定的ID,以便在JavaScript中调用。 CSS样式 在CSS中,我们可以为数字设置样式,以便它们在抽奖过程中呈现不同的状…

    JavaScript 2023年6月11日
    00
  • 微信小程序实现虎年春节头像制作

    下面为大家详细讲解“微信小程序实现虎年春节头像制作”的完整攻略。 一、背景介绍 2022年是中国农历的虎年,为了庆祝这一传统节日,我们打算通过微信小程序的形式为用户提供制作虎年春节头像的功能。 二、实现原理 在微信小程序中,我们可以通过使用canvas标签,动态生成图片,并将其保存到手机相册中。 实现的大致流程如下所示: 用户在小程序中选择模板并上传自己的照…

    JavaScript 2023年6月11日
    00
  • 详解如何优雅迭代JavaScript字面对象

    下面我将详细讲解如何优雅迭代JavaScript字面对象。 什么是字面对象? 字面对象是JS中一种非常常见的数据类型。它就像一个存储键值对的容器,用于表示一个对象或者一个数组等数据结构。比如下面这个字面对象: const person = { name: "张三", age: 20, sex: "男", address…

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