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日

相关文章

  • javascript实现时间格式输出FormatDate函数

    当我们需要在网页中显示时间的时候,通常需要用到格式化时间的函数,而JavaScript是一门非常有用的语言。下面让我来为您讲解如何使用JavaScript实现时间格式输出,步骤如下: 步骤1:创建一个FormatDate函数 首先我们需要创建一个函数来实现对时间进行格式化输出。可以为这个函数传入两个参数- 时间对象和一个时间格式字符串。 function F…

    JavaScript 2023年5月27日
    00
  • javascript设计模式 – 解释器模式原理与用法实例分析

    JavaScript设计模式 – 解释器模式原理与用法实例分析 解释器模式概述 解释器模式是一种行为型模式,它定义了一种语言语法,并实现了该语言的解释器。通过解析表达式来实现对语言的操作。 在JavaScript中,这个解释器就是一个函数,接收一个字符串表达式作为参数,并返回解析后的结果。 解释器模式适用于处理特定的语法规则和行为,并且针对方案的性能要求不高…

    JavaScript 2023年5月28日
    00
  • 浅谈JavaScript函数的四种存在形态

    下面是关于JavaScript函数四种存在形态的攻略。 一、函数声明形式 函数声明是最常用的JavaScript函数形式,有如下示例: function add(a, b) { return a + b; } 在此形式下,函数关键字 function 接受一个函数名,而后面的圆括号内则包含了所有参数。在这里,add 函数负责接受两个参数 a 和 b 并返回它…

    JavaScript 2023年5月27日
    00
  • JS Map 和 List 的简单实现代码

    当我们在使用JavaScript的时候,有时候需要使用一些数据类型来进行操作和处理。在这些数据类型中,Map和List就是两个常用的数据类型之一。 什么是Map和List 在JavaScript中,Map是一种用于存储键值对的集合。Map中的键可以是任意类型的值,如字符串、数字甚至是对象,同样的值可以对应于不同的键。而List则是一种由一列元素组成的有序集合…

    JavaScript 2023年6月10日
    00
  • JavaScript代码实现简单日历效果

    JavaScript代码实现简单日历效果 引言 日历是人们生活中必不可少的一部分,Javascript通过操作DOM元素以及CSS样式,实现了多种简单的日历效果。本文将详细介绍JavaScript如何实现一个简单的日历效果。 分析与目标 首先,我们要对一个日历的样式进行分析,发现日历主要是由星期和日期构成的,其次各个日期的显示状态需通过计算天数来完成。 所以…

    JavaScript 2023年5月27日
    00
  • 一起来学习JavaScript的语法基础

    一起来学习JavaScript的语法基础 1. 简介 JavaScript是一种常用的脚本语言,用于在Web浏览器中实现交互式功能,如动态更新HTML、验证表单和创建动画效果等。如果你想成为一名Web前端开发人员,学习JavaScript是必不可少的。本攻略旨在帮助初学者了解JavaScript的语法基础。 2. 数据类型 JavaScript中有七种基本数…

    JavaScript 2023年5月17日
    00
  • js实现精确到秒的日期选择器完整实例

    下面就是关于“js实现精确到秒的日期选择器完整实例”的详细攻略。 1. 实现思路 根据需求,我们需要实现一个日期选择器,可以精确到秒,并且用户选择的日期和时间要能够转化成特定格式的字符串。实现思路如下: 创建DateSelector构造函数,接受一个DOM元素作为参数,用于将日期选择器添加到该元素中。 在构造函数中创建一个input元素,用户可以通过该元素选…

    JavaScript 2023年5月27日
    00
  • JavaScript防抖与节流的实现与注意事项

    JavaScript防抖与节流的实现与注意事项 在前端开发中,我们经常会碰到需要对用户输入或页面滚动等事件进行优化的情况,这时就需要考虑使用防抖与节流的技术来控制这些事件的触发频率,以避免性能浪费和出错。 防抖 防抖是指在一定时间后执行函数,如果在这段时间内再次触发函数,那么就重新计时,在下一个一定时间后执行函数。可以理解为对于多次连续事件只执行一次操作。 …

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