当前位置: 首页 > news >正文

深浅拷贝以及函数缓存

目录

数据类型介绍

基本数据类型(Primitive Types)

引用数据类型(Reference Types)

浅拷贝

深拷贝

利用JSON的序列化和反序列化实现深拷贝

递归实现深拷贝

第三方库lodash的cloneDeep

函数缓存的概念

 实现方法


数据类型介绍

要想了解深浅拷贝,首先得知道有哪些数据类型。在Javascript中,存在两大数据类型:

基本数据类型(Primitive Types)

JavaScript的基本数据类型包括以下六种:

  • Number: 用于表示整数或浮点数。例如:423.14
  • String: 用于表示文本数据。例如:"hello"'world'
  • Boolean: 表示逻辑值,只有truefalse两种。
  • Undefined: 表示变量未定义或未赋值。例如:let a;,此时aundefined
  • Null: 表示空值,通常用于明确赋空值的情况。例如:let b = null;
  • Symbol(ES6新增):表示唯一且不可变的值,通常用于对象属性的键。例如:Symbol('id')

基本数据类型的特点是不可变,直接存储在栈内存中。

引用数据类型(Reference Types)

引用数据类型主要包括以下两种:

  • Object: 用于存储键值对或复杂数据结构。例如:{ name: "Alice", age: 25 }
  • Array: 是特殊的对象,用于存储有序数据。例如:[1, 2, 3]
  • Function: 也是对象的一种,可以被调用执行。例如:function() { return "hello"; }
  • DateRegExp等内置对象。

引用数据类型的特点是可变,数据存储在堆内存中,变量存储的是指向堆内存的地址。

在编程中,基本数据类型通常不涉及深拷贝或浅拷贝的概念。所以面试常问的深浅拷贝指的是针对引用数据的处理。

浅拷贝

仅复制对象的顶层属性,如果属性是引用类型(如数组、对象),则复制的是引用而非实际对象。因此,修改拷贝后的引用类型属性会影响原对象。

实现浅拷贝的方式有很多,举几个案例:

 
// Object.assign()
// 使用 Object.assign() 可以快速实现浅拷贝:
const original = { a: 1, b: { c: 2 } };
const copy = Object.assign({}, original);// 展开运算符(...)
// ES6 的展开运算符也能实现浅拷贝:
const original = { a: 1, b: { c: 2 } };
const copy = Object.assign({}, original);// 数组的浅拷贝
// 对于数组,可以使用 slice() 或 concat():
const originalArray = [1, 2, { a: 3 }];
const copyArray = originalArray.slice();

注意

引用赋值共享同一个对象,无独立性,不属于浅拷贝
浅拷贝第一层属性独立,嵌套引用类型仍共享

var a = {a:1}
var b = a

深拷贝

会递归复制对象的所有层级,包括引用类型属性,生成一个完全独立的新对象。修改深拷贝后的对象不会影响原对象。

深拷贝开辟一个新的栈,两个对象的属性完全相同,但是对应两个不同的地址,修改一个对象的属性,不会改变另外一个

利用JSON的序列化和反序列化实现深拷贝

JSON.parse(JSON.stringify())

优点:简单易用,常见的深拷贝的方法

缺点:无法处理函数、Symbol、undefined等非 JSON 兼容类型,会丢失这些属性

const original = { a: 1, b: { c: 2 } };
const copy = JSON.parse(JSON.stringify(original));

递归实现深拷贝

优点:可以处理各种类型

缺点:需要手动处理循环引用等问题

function deepClone(obj) {if (obj === null || typeof obj !== 'object') {return obj;}const clone = Array.isArray(obj) ? [] : {};for (let key in obj) {if (obj.hasOwnProperty(key)) {clone[key] = deepClone(obj[key]);}}return clone;
}

第三方库lodash的cloneDeep

优点:功能完善,处理了各种边界情况

缺点:需要引入额外库

const _ = require('lodash');
const obj = {a: 1, b: {c: 2}};
const clone = _.cloneDeep(obj);

函数缓存的概念

函数缓存是一种优化技术,通过存储函数计算结果避免重复执行相同输入的计算。适用于计算成本高或输入输出稳定的场景,如递归、API调用或数学运算。

函数缓存,就是将函数运算过的结果进行缓存,本质上就是用空间(缓存存储)换时间(计算过程),常用于缓存数据计算结果和缓存对象

 实现方法

实现函数缓存主要依靠闭包、柯里化、高阶函数。详解在其他文章。

http://www.lryc.cn/news/587934.html

相关文章:

  • 机床自动化中的“方言翻译官”:EtherNet/IP 转 PROFIBUS DP 实战手记
  • Redis作缓存时存在的问题及其解决方案
  • TensorFlow深度学习实战(26)——生成对抗网络详解与实现
  • 聚宽sql数据库传递
  • sqlserver迁移日志文件和数据文件
  • pytorch小记(二十九):深入解析 PyTorch 中的 `torch.clip`(及其别名 `torch.clamp`)
  • linux 驱动的platform机制:
  • SQL ORM映射框架深度剖析:从原理到实战优化
  • SPL 轻量级多源混算实践
  • Redis集群方案——Redis分片集群
  • Linux 消息队列接收与处理线程实现
  • python的微竞网咖管理系统
  • P2802 回家
  • 国家互联网信息办公室关于发布第十二批深度合成服务算法备案信息的公告
  • 力扣算法--数青蛙与外观数列问题
  • 3.2 WPF 画散点图
  • 【Python3教程】Python3高级篇之MySQL - mysql-connector 驱动介绍及示例
  • 【WPF】WPF 自定义控件 实战详解,含命令实现
  • 深地之下的智慧触角:Deepoc具身智能如何为矿业机器人铸就“感知之核”
  • Mac (m1) Java 加载本地C共享库函数 .dylib 函数 Unable to load library ‘liblicense‘
  • 【爬虫】Python实现爬取京东商品信息(超详细)
  • 来时路,零帧起手到Oracle大师
  • FilterRegistationBean报错does not have type parameters。idea启动日志无明显报错提示冲突 kaki的博客
  • IDEA实现纯java项目并打包jar(不使用Maven,Spring)
  • Linux的相关学习
  • Oracle物化视图函数使用注意事项
  • Oracle 递归函数及 其他数据库 CTE 使用小计
  • SpringBoot集成SAP,本地IDEA启动和Windows服务器部署
  • 企业培训笔记:axios 发送 ajax 请求
  • iOS高级开发工程师面试——RunLoop