【JavaScript】面试手撕浅拷贝

【JavaScript】面试手撕浅拷贝

引入

浅拷贝和深拷贝应该是面试时非常常见的问题了,为了能将这两者说清楚,于是打算用两篇文章分别解释下深浅拷贝。

PS: 我第一次听到拷贝这个词,有种莫名的熟悉感,感觉跟某个英文很相似,后来发现确实Copy的音译,感觉这翻译还是蛮有意思的。🐶

什么是浅拷贝

行文至此,肯定会有朋友问,什么事浅拷贝呢?顾名思义,就是浅浅的copy一下。🐶

JavaScript中,对于浅拷贝分为两种情况。

  • 对于浅拷贝,如果待拷贝的数据是基础类型的属性(如NumberStringBoolean等基本类型),那么只需要将这个值直接复制过来即可
  • 对于浅拷贝,如果待拷贝的数据是引用类型的属性(如对象,数组),那么复制的则是对象的引用以及第一层的基础属性值

基础类型与引用类型的区别

谈到这,顺带谈一下基础类型引用类型的区别。

基础类型
  • 直接存储在栈内存中。
  • 存储的是实际的数据值。
  • 内存空间固定且较小。
引用类型
  • 对象(如数组,函数,对象等)的属性值存在堆内存中。
  • 栈内存中存储的是指向堆内存中对象的引用或指针,而非对象本身的内容。
  • 内存空间大小不固定,取决于对象结构的复杂性。

手动实现浅拷贝

因为值的拷贝可以直接赋值即可。我们这里实现下对象的浅拷贝。

对象的浅拷贝:复制对象的引用以及第一层属性值。

思路: 我们先构造一个新对象,然后将它的属性值等于原对象的属性值。这里新对象和原对象的属性依然会共享引用,但对于第一层的基础属性却不会共享了。所以我们实现的浅拷贝 是拷贝一层。

function shallowClone(obj) {const newObj = {};for (let prop in obj) {if (obj.hasOwnProperty(prop)) {newObj[prop] = obj[prop];}}return newObj;
}const test = { a: 1, b: 2 };
const newTest = shallowClone(test);
newTest.a = 2;
console.log('test: ',test,' newTest: ', newTest);
/*** 输入如下,第一层基础属性的值不会共享了* test:  { a: 1, b: 2 }  newTest:  { a: 2, b: 2 }*/

Js自带浅拷贝的方法

对于Js的浅拷贝,可以分为对象浅拷贝数组浅拷贝

对象浅拷贝

对于对象的浅拷贝有object.assgin拓展运算符实现,这里的浅拷贝都是拷贝一层。

Object.assign

Object.assign()ES6 中引入的一个方法,用于将一个或多个源对象的所有可枚举属性分配到目标对象上。

const original = { a: 1, b: { c: 2 } };
const shallowCopy = Object.assign({}, original);
拓展运算符

注意:这种方式同样会创建一个新的对象,但对嵌套对象或数组只会进行浅拷贝。

const original = { a: 1, b: { c: 2 } };
const shallowCopy = { ...original };

数组浅拷贝

slice

slice()方法是用来从数组中提取一部分元素生成新数组的方法,它确实实现了数组的浅拷贝。

let originalArray = [1, 2, { a: 3 }, [4, 5]];
let copiedArray = originalArray.slice();// 浅拷贝后,原始数组和拷贝数组中基本类型元素是独立的
copiedArray[0] = 100; // 修改基本类型元素,不影响原数组
console.log(originalArray); // 输出:[1, 2, { a: 3 }, [4, 5]]
console.log(copiedArray); // 输出:[100, 2, { a: 3 }, [4, 5]]// 但是对于引用类型元素,修改其属性或内容会同时影响原数组和拷贝数组
copiedArray[2].a = 456;
copiedArray[3][0] = 7;console.log(originalArray); // 输出:[1, 2, { a: 456 }, [7, 5]]
console.log(copiedArray); // 输出:[100, 2, { a: 456 }, [7, 5]]

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

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

相关文章

工业云组态:制造业数字化转型的关键

随着第四次工业革命的到来,数字化转型已成为制造业提升竞争力、实现可持续发展的核心驱动力。在这一背景下,HiWoo Cloud平台推出了工业云组态解决方案,旨在通过云计算、大数据和物联网等先进技术的融合,助力制造业实现智能化、高效…

力扣经典题目解析--最小覆盖子串

原题地址: . - 力扣(LeetCode) 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。 注意: 对于 t 中重复字符,我们寻找…

刷题日记:面试经典 150 题 DAY3

刷题日记:面试经典 150 题 DAY3 274. H 指数238. 除自身以外数组的乘积380. O(1) 时间插入、删除和获取随机元素134. 加油站135. 分发糖果 274. H 指数 原题链接 274. H 指数 重要的是都明白H指数到底是是个啥。注意到如果将引用数从大到小排序,则对于…

考研复试指南

1. 记住,复试的本质不是考试,而是一场自我展示。 考研复试并非简单的知识考察,更是一场展示自我能力和潜力的机会。除了学科知识,考官更关注你的综合素质、学术兴趣和未来发展规划。因此,要保持自信,用更全…

机器学习模型总结

多元线性回归(linear regression) 自变量:连续型数据,因变量:连续型数据 选自:周志华老师《机器学习》P53-55 思想:残差平方和达到最小时的关系式子即为所求,残差平方和&#xff1a…

uniapp 部署h5,pdf预览

1.hubuilderx 打包h5。 2.上传部署包到服务器。 解压部署包:unzip h5.zip 。 3.nginx配置。 user root; worker_processes 1; #worker_cpu_affinity 0001 0010 0100 1000; #error_log logs/error.log; #error_log logs/error.log notice; error_log /var/l…

抖店怎么入驻?具体的入驻流程是什么?新手一看就会!

我是电商珠珠 新的一年开始了,又有不少新手小伙伴入驻了抖店。我做电商已经五年了,做抖店做了三年多,期间带着学员一起做店。所以对于他们所犯的这些操作错误,相信部分新手小伙伴也会犯错,为了让大家少走点弯路&#…

便携式气象站的工作原理

TH-BQX8便携式气象站是一种轻便、易于携带的气象监测设备,它能够快速部署在需要监测的区域,实时监测和记录气象环境数据。与全自动气象监测站相比,便携式气象站更加注重移动性和灵活性,适用于临时性的气象监测任务或特定区域的气象…

【大厂AI课学习笔记NO.58】(11)混淆矩阵

混淆矩阵(confusion matrix)—— 混淆矩阵(Confusion Matrix)是人工智能领域,特别是在机器学习和深度学习中,用于衡量分类模型性能的重要工具。它通过统计分类模型的真实分类与预测分类之间的结果&#xf…

12. Nginx进阶-Location

简介 Nginx的三大区块 在Nginx中主要配置包括三个区块,结构如下: http { #协议级别include /etc/nginx/mime.types;default_type application/octet-stream;log_format main $remote_addr - $remote_user [$time_local] "$r…

javascript中对包含关系判断介绍

本文将为您详细讲解 JavaScript 中对包含关系的判断,包括数组、字符串等,并提供相应的代码例子。 1. 数组包含关系判断 在 JavaScript 中,数组包含关系判断通常使用 Array.prototype.includes() 方法。这个方法返回一个布尔值,表示…

辽宁博学优晨教育视频:引领安全可靠的学习新风尚

在数字化时代,随着信息技术的飞速发展,线上教育已成为越来越多人提升自我、拓宽视野的重要选择。辽宁博学优晨教育视频凭借其安全可靠的特质,在众多在线教育平台中脱颖而出,成为广大学子信赖的学习伙伴。 一、辽宁博学优晨教育视频…