【面试常见问题】深拷贝与浅拷贝

      

目录

一、浅拷贝基础

定义与原理

面试知识点扩展

代码示例

使用 Object.assign()

展开运算符 ...

二、深拷贝详解

定义与重要性

面试技巧

代码示例

手动递归实现

使用JSON方法(简单情况)

使用第三方库lodash

三、深拷贝与浅拷贝的选择依据

四、拓展知识


         在技术面试中,深拷贝(Deep Copy)与浅拷贝(Shallow Copy)是考察JavaScript基础与理解对象复制机制的常见话题。掌握这两者不仅有助于解决实际开发中的数据隔离问题,还能在面试中展示你对JavaScript核心概念的深入理解。

一、浅拷贝基础

定义与原理

        浅拷贝创建一个新对象,其属性值是对原对象属性值的直接引用(对于非原始类型的属性)。这意味着如果原对象的属性是引用类型(如数组、对象),修改这些引用类型的数据会影响到拷贝对象。

面试知识点扩展

  • 实现方式:JavaScript中实现浅拷贝的方法包括 Object.assign()、展开运算符 ...、以及直接赋值(对于数组或对象的第一层)。
  • 陷阱:面试官可能会询问浅拷贝在处理嵌套对象或数组时的问题,强调浅拷贝的局限性,比如上述方法在处理深层结构时的不足。

代码示例

使用 Object.assign()
let original = { a: 1, b: { c: 2 } };
let shallowCopy = Object.assign({}, original);// 修改原对象中的嵌套对象
original.b.c = 3;console.log(original); // { a: 1, b: { c: 3 } }
console.log(shallowCopy); // { a: 1, b: { c: 3 } } 注意b.c也被修改了
展开运算符 ...
let originalArray = [1, { a: 2 }];
let shallowCopiedArray = [...originalArray];// 修改原数组中的对象
originalArray[1].a = 3;console.log(originalArray); // [1, { a: 3 }]
console.log(shallowCopiedArray); // [1, { a: 3 }] 数组中的对象被修改了

二、深拷贝详解

定义与重要性

        深拷贝创建一个新对象,并递归地复制原对象的所有属性,直至最底层的基本数据类型,确保原对象与拷贝对象在内存中完全独立。

面试技巧

  • 面试高频问题:如何实现深拷贝?手动实现深拷贝是面试中的经典问题,考察点在于对递归、对象类型判断以及处理循环引用的能力。
  • 方法介绍:可以使用JSON的 parse 和 stringify 方法进行简单深拷贝(但注意这种方法的局限性,如无法处理函数和循环引用),或手写递归函数实现更全面的解决方案。

代码示例

手动递归实现
function deepCopy(obj) {if (obj === null || typeof obj !== 'object') return obj;let copy = Array.isArray(obj) ? [] : {};for (let key in obj) {if (obj.hasOwnProperty(key)) {copy[key] = deepCopy(obj[key]);}}return copy;
}let original = { a: 1, b: { c: 2 } };
let deepCopied = deepCopy(original);original.b.c = 3;console.log(original); // { a: 1, b: { c: 3 } }
console.log(deepCopied); // { a: 1, b: { c: 2 } } 深拷贝后的对象不受影响
使用JSON方法(简单情况)
let originalSimple = { a: 1, b: 2 };
let deepCopiedSimple = JSON.parse(JSON.stringify(originalSimple));// 假设我们尝试修改原对象
originalSimple.a = 3;console.log(originalSimple); // { a: 3, b: 2 }
console.log(deepCopiedSimple); // { a: 1, b: 2 } 深拷贝对象不受影响// 注意:此方法不适用于含有函数、RegExp、Date等特殊类型或循环引用的对象
使用第三方库lodash
// 首先确保已经安装并导入了lodash
import _ from 'lodash';let originalLodash = { a: 1, b: { c: 2 } };
let deepCopiedLodash = _.cloneDeep(originalLodash);originalLodash.b.c = 3;console.log(originalLodash); // { a: 1, b: { c: 3 } }
console.log(deepCopiedLodash); // { a: 1, b: { c: 2 } } 完全独立

三、深拷贝与浅拷贝的选择依据

  • 数据独立性:需要完全隔离数据修改时,选择深拷贝。
  • 性能考量:浅拷贝更轻量,适合简单数据结构或性能敏感场景。
  • 对象复杂度:面对多层嵌套或特殊类型(如函数、循环引用)时,深拷贝更为合适。

四、拓展知识

  • 循环引用问题:在复杂的对象结构中,对象之间可能存在循环引用,这在深拷贝时需要特别处理,否则可能导致栈溢出。
  • 第三方库实现:了解并提及一些第三方库(如lodash的_.cloneDeep)提供的深拷贝功能,展现对生态的熟悉度。

        掌握深拷贝与浅拷贝不仅是面试成功的关键,更是JavaScript高级开发不可或缺的知识点。通过深入理解其原理、实践操作及潜在问题,你将能在面试中脱颖而出,同时在日常开发中避免数据处理的常见bug。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/20177.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity学习笔记---音视频播放

音频 Audiolistener组件 AudioListener组件是音频监听器,将组件挂在角色或camera上面,每个场景中最多只有一个AudioListener组件。 AudioSource组件 AudioSource组件是音源,用来播放音频AudioClip.将他挂在产生声音的物体上,可…

筛斗数据提取技术在企业成本预测中的应用

在当今的商业环境中,准确的成本预测对于企业的财务健康和战略规划至关重要。随着大数据和人工智能技术的飞速发展,数据提取技术已经成为企业进行成本预测的强大工具。本文将探讨数据提取技术如何帮助企业进行成本预测,并分析其对企业决策过程…

C++ 课堂实验 编写一个能判断数字大小的小程序

本关任务:编写一个能判断数字大小的小程序。 相关知识 为了完成本关任务,你需要掌握:1.基本输入输出,2.简单条件判断语句。 编程要求 问题:输入2个整数,再进行判断输出大的数。 效果如下: 输入&…

基于stm32的智能家居系统

目录 1.课题研究目的和内容 1.1 课题研究目的 1.2 课题研究内容 2.系统总体方案设计及功能模块介绍 2.1 总体方案设计 2.2 DHT11模块介绍 2.3 TFTLCD显示功能模块介绍 2.4 ESP8266WIFI模块介绍 2.5 MQ-135 空气质量模块介绍 2.6 步进电机模块介绍 2.…

划分字母区间 - LeetCode 热题 80

大家好!我是曾续缘🤖 今天是《LeetCode 热题 100》系列 发车第 80 天 贪心算法第 4 题 ❤️点赞 👍 收藏 ⭐再看,养成习惯 划分字母区间 给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现…

solr-8.11.3

https://solr.apache.org/downloads.html https://archive.apache.org/dist/solr/solr/ F:\Document_Solr.apache.org\solr-8.11.3\bin Microsoft Windows [版本 10.0.19045.2965] (c) Microsoft Corporation。保留所有权利。 C:\Users\Administrator>F: F:\> F:\>…

(持续更新)ai 工程师(nlp)面试问题+答案

python基础 浅拷贝和深拷贝浅拷贝:copy() 浅拷贝意味着创建一个新的对象,但是这个对象包含的元素仍然是原始对象中元素的引用。也就是说,如果原始对象中的元素是可变的(比如列表、字典等),那么在拷贝对象中修改这些元素会影响到原始对象。 深拷贝:deepcopy() 深拷贝会创…

2023年03月 Python(六级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,共50分) 第1题 有如下程序段: with open(mistakes.txt, w) as f:words [believe,memorize]f.write(\n.join(words))执行该代码后,…

springboot基础及上传组件封装

简介 本文主要以文件上传为demo,介绍了一些 springboot web 开发的入门的技术栈。 对应刚接触 springboot 的可以参考下。 主要包括文件md5比对、生成图片缩略图、数据库迁移、文件记录持久化、请求全局异常处理等功能。 准备工作 在 idea 中创建项目&#xff…

Ceph集群存储案例

Ceph是一种可靠的、可扩展的、统一的、分布式的存储系统。Ceph高度可靠、易于管理且免费。Ceph提供了非凡的可扩展性——数以千计的客户端访问PB到EB的数据。Ceph存储集群相互通信以动态复制和重新分配数据。目前众多云厂商都在使用Ceph,应用广泛。如:华…

【C++ ——— 哈希】位图 | 布隆过滤器

文章目录 1、位图1.1位图概念 2.位图实现位图的应用1.一百亿个整数,设计算法找到只出现一次的整数?2.给两个文件,分别有一百亿个整数,我们只有1G内存该如何找到两个文件的交集?3.位图应用变形:一个文件有100亿个int&a…

【介绍下运维,什么是运维?】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

Linux 编译安装python

以deepin操作系统安装Python3.8.10为例。 下载 python3.8.10 官网下载 Linux要下载源码,进行编译。 下图tarball即tar包,是压缩包的意思。python官网给出两种压缩格式的tarball,下载哪个都可以。 方式一:直接点击链接下载 方式…

python-模块-网络编程-多任务

一、模块 1-1 Python 自带模块 Json模块 处理json数据 {"key":"value"} json不是字典 本质是一个有引号的字符串数据 json注意点 {} 中的数据是字符串引号必须是双引号 使用json模块可以实现将json转为字典,使用字典的方法操作数据 。 或者将…

Debian和ubuntu 嵌入式的系统的 区别

随着开源操作系统的日益流行,Debian和Ubuntu这两个基于Linux的发行版本成为了众多开发者和系统管理员的首选。它们各自拥有独特的优势和特点,那么,在选择时,哪一个更适合你呢?接下来,我们将深入探讨两者的关…

C++候捷stl-视频笔记2

深度搜索list list是双向链表:底部实现是环状双向链表 list内部除了存data之外,还要存一个前向指针prev和一个后向指针next list的iterator,当迭代器的时候,是从一个节点走到下一个节点,是通过访问next指针实现的 主要…

NFS p.1 服务器的部署以及客户端与服务端的远程挂载

目录 介绍 应用 NFS的工作原理 NFS的使用 步骤 1、两台机子 2、安装 3、配置文件 4、实验 服务端 准备 启动服务: 客户端 准备 步骤 介绍 NFS(Network File System,网络文件系统)是一种古老的用于在UNIX/Linux主…

新宏观范式和产业趋势下,纷享销客如何助力企业出海?

出海,已不再是企业的“备胎”,而是必须面对的“大考”!在这个全球化的大潮中,有的企业乘风破浪,勇攀高峰,也有的企业在异国他乡遭遇了“水土不服”。 面对“要么出海,要么出局”的抉择&#xff…

多线程基础知识-

线程同步需要注意什么 ,线程同步是一种机制,用于确保多个线程在访问共享资源时的安全性。在进行线程同步时,需要注意以下几点: 互斥性:确保同一时间只有一个线程可以访问共享资源。可以使用synchronized关键字来实现互…

C++设计模式-策略模式

文章目录 27. 策略模式 运行在VS2022,x86,Debug下。 27. 策略模式 策略模式让算法的选择与使用独立开来,使得代码更灵活、可扩展和易维护。应用:如在游戏开发中,AI角色需要根据环境和条件做出不同的行为,如…