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

yizhihongxing

下面是详细讲解“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 this指针

    Javascript中的this指针用于指示当前执行的代码所属的对象。在不同的情况下,this指向的对象是不同的,因此在使用this时需要谨慎处理。下面将详细介绍Javascript this指针的相关知识和使用技巧。 什么是this指针? 在Javascript中,this指针是一个关键字,用于指示当前执行的代码所属的对象。this关键字可以在任何函数中使…

    JavaScript 2023年6月11日
    00
  • 详解Vuex管理登录状态

    详解Vuex管理登录状态 Vuex是一个专门为Vue.js应用程序开发的状态管理库,它能够用来管理整个应用程序的状态。其中包括登录状态的管理。下面将详细讲解如何使用Vuex来管理登录状态。 步骤一:安装Vuex 首先需要使用npm或yarn安装Vuex。使用npm安装的命令如下: npm install vuex –save 步骤二:创建Vuex Stor…

    JavaScript 2023年6月11日
    00
  • JavaScript中的匀速运动和变速(缓冲)运动详细介绍

    针对“JavaScript中的匀速运动和变速(缓冲)运动详细介绍”的攻略,我先来给大家解析相关概念,再介绍示例演示。 第一部分:匀速运动与变速(缓冲)运动介绍 什么是匀速运动? 匀速运动是指物体在单位时间内走过相同的路程,即走过路程与时间成正比。在JavaScript中,可以通过changeTo函数实现匀速动画效果,其特点为速度不变,使得动画运动的路径是一条…

    JavaScript 2023年6月10日
    00
  • IE浏览器与FF浏览器关于Ajax传递参数值为中文时的区别实例分析

    针对“IE浏览器与FF浏览器关于Ajax传递参数值为中文时的区别实例分析”,我们可以从以下几个方面进行讲解: URL编码的区别 在使用Ajax传递参数时,中文参数需要进行URL编码,然后再进行发送。而IE浏览器和FF浏览器对URL编码的处理是不同的: IE浏览器:使用escape()函数对中文参数进行编码。 FF浏览器:使用encodeURIComponen…

    JavaScript 2023年5月19日
    00
  • 深入理解Jquery表单验证(使用formValidator)

    深入理解JQuery表单验证(使用formValidator) 简介 JQuery表单验证是前端开发中经常使用到的技术之一,它可以对用户输入的表单数据进行自定义的验证。本篇文章将介绍如何使用 JQuery 插件 formValidator 进行表单验证。 安装 首先需要在项目中引入 JQuery 和 formValidator。 <head> &…

    JavaScript 2023年6月10日
    00
  • 微信小程序 闭包写法详细介绍

    关于“微信小程序 闭包写法详细介绍”的攻略,我将按照以下的结构和内容进行详细讲解: 一、什么是闭包 闭包是JavaScript里的一个重要概念,它是指那些能够访问自由变量的函数。也就是说,闭包可以读取、修改函数内部的变量,并且这些变量在函数外部仍然可以被访问到。在实际的编程中,闭包通常被用来创建一些私有变量和私有方法,以实现封装的目的。 二、如何在微信小程序…

    JavaScript 2023年6月10日
    00
  • Java如何在临界区中避免竞态条件

    当多个线程同时访问共享资源时,容易产生竞态条件,导致程序异常或结果不可预测。Java中可以通过使用锁机制来避免竞态条件,实现线程安全。 下面是Java如何在临界区中避免竞态条件的完整攻略: 1. 使用synchronized关键字 在Java中,可以使用synchronized关键字来锁住共享资源,在同一时刻只允许一个线程访问。具体步骤如下: 定义共享资源对…

    JavaScript 2023年5月28日
    00
  • JS中LocalStorage与SessionStorage五种循序渐进的使用方法

    LocalStorage和SessionStorage是HTML5中提供的本地存储技术,可用于存储一些少量的数据(5-10MB左右),用于客户端浏览器处理一些无需进行服务器数据交互的场景。在JavaScript中,我们可以使用以下五种方法来使用LocalStorage和SessionStorage。 1. 存储数据 LocalStorage和SessionS…

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