前端面试题11(浅谈JavaScript深拷贝与浅拷贝)

news/2024/7/8 8:00:05 标签: 前端, javascript

在这里插入图片描述
在JavaScript中,数据的复制可以分为浅拷贝(Shallow Copy)和深拷贝(Deep Copy)。这两种拷贝方式主要区别在于如何处理对象中的嵌套对象。下面我会详细解释这两者的概念、区别,并提供相应的实现代码。

浅拷贝

浅拷贝是指创建一个新的对象,这个新对象的属性值是原对象属性值的引用(对于原始类型如字符串、数字、布尔值等是值的拷贝,而对于对象、数组等复杂类型则是引用的拷贝)。如果原对象的某个属性是一个对象,那么浅拷贝得到的新对象对应的属性将指向原对象中该属性所指向的对象的内存地址,也就是说拷贝得到的是同一个对象的引用。

实现浅拷贝的方法:
  1. Object.assign()

    javascript">const obj = { a: 1, b: { c: 2 } };
    const shallowCopy = Object.assign({}, obj);
    
  2. Spread Operator (扩展运算符)

    javascript">const obj = { a: 1, b: { c: 2 } };
    const shallowCopy = { ...obj };
    

深拷贝

深拷贝则是递归地拷贝原对象的所有层级,直到遇到不可遍历的值(如基本类型)。这意味着,无论对象的嵌套层次多深,深拷贝都会创建一个全新的对象,拥有与原对象相同内容但完全不同内存地址的副本,包括所有子对象也会被拷贝。

实现深拷贝的方法:
  1. JSON.parse() 和 JSON.stringify()
    注意这种方法对于函数、undefined、循环引用等情况不适用。

    javascript">const obj = { a: 1, b: { c: 2 } };
    const deepCopy = JSON.parse(JSON.stringify(obj));
    
  2. 递归实现
    这种方法可以处理更多复杂情况,如函数、日期对象等。

    javascript">function deepClone(obj, hash = new WeakMap()) {
      if (obj === null || typeof obj !== 'object') return obj;
      if (hash.has(obj)) return hash.get(obj);
      
      let cloneObj = new obj.constructor();
      hash.set(obj, cloneObj);
      
      for (let key in obj) {
        if (obj.hasOwnProperty(key)) {
          cloneObj[key] = deepClone(obj[key], hash);
        }
      }
      return cloneObj;
    }
    
    const obj = { a: 1, b: { c: 2 }, d: new Date() };
    const deepCopy = deepClone(obj);
    

总结

  • 浅拷贝只拷贝一层,对于对象或数组中的嵌套对象只是拷贝了引用。
  • 深拷贝会递归拷贝所有层级,创建一个完全独立的副本。

http://www.niftyadmin.cn/n/5536790.html

相关文章

使用Qt制作一个简单的界面

1、创建工程 步骤一: 步骤二: 步骤三: 选择 build system,有qmake、CMake 和 Qbs 三个选项。 CMake 很常用,功能也很强大,许多知名的项目都是用它,比如 OpenCV 和 VTK,但它的语法繁…

WPF----进度条ProgressBar(渐变色)

ProgressBar 是一种用于指示进程或任务的进度的控件,通常在图形用户界面(GUI)中使用。它提供了一种视觉反馈,显示任务的完成程度,帮助用户了解任务的进展情况。 基本特性 Minimum 和 Maximum 属性: 这些属…

MySQL期末答辩—仓库管理系统

仓库管理系统:仓库管理系统是一种基于互联网对实际仓库的管理平台,旨在提供一个方便、快捷、安全的存取货物和查询商品信息平台。该系统通过在线用户登录查询,可以线上操作线下具体出/入库操作、查询仓库商品信息、提高仓库运作效率&#xff…

无服务器【Serverless】架构的深度剖析:组件介绍、优缺点与适用场景

🐇明明跟你说过:个人主页 🏅个人专栏:《未来已来:云原生之旅》🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、云计算的发展趋势 2、无服务器计算简介 二、无服务…

Python推导式写出简洁高效的代码方法详解

概要 推导式是Python中一种非常强大的语法特性,允许你用简洁的语法创建列表、字典、集合等数据结构。使用推导式不仅可以让代码更加简洁和易读,还能提高代码的执行效率。本文将详细介绍Python中的各种推导式,并提供相应的示例代码,帮助全面掌握这一强大的工具。 列表推导式…

Cherno 游戏引擎笔记 (45~60)

有几个部分的笔记以图片形式呈现(如果没找到文本可以查看是否遗漏了图片笔记) My Github REPO(GitHub - JJJJJJJustin/Nut: The game_engine which learned from Cherno) 源码笔记,希望帮到你 :-} ---Shader Library(着色器库&…

GNU/Linux - 什么是loopback设备

在计算机科学中,特别是在类Unix操作系统中,环回设备(loopback device)是一种虚拟设备,它将一个文件映射为块设备。这使得可以像访问物理磁盘或分区一样访问一个文件。环回设备通常用于挂载磁盘镜像、操作文件系统镜像以…

Spring MVC数据绑定和响应——复杂数据绑定(四)JSON数据绑定

一、消息转换器—HttpMessageConverter接口 客户端不同的请求,HttpServletRequest中数据的MediaType可能会不同,如果想将HttpServletRequest中的数据转换成指定对象,或者将对象转换成指定格式的数据,就需要使用对应的消息转换器来…