2024前端面试题(持续更新)
目录
一、js的数据类型有哪些?
二、什么是symbol?
三、什么是浅拷贝什么是深拷贝?
四、vue2的生命周期?
五、vue2中父子组件的生命周期调用顺序
六、vue3的生命周期
七、vue3对比vue2的变化
八、组合式API中的ref和reactive是什么?
一、js的数据类型有哪些?
1、基本数据类型
string字符串、number数字、boolean布尔值、undefined未定义、null空值、bigint大数、symbol不变值。
2、复杂数据类型
object对象、array数组、function函数、date日期、regexp正则、map键值对集合、set唯一值集合。
二、什么是symbol?
symbol表示第一无二唯一的值,它有几个特性:
1、唯一性
每次调用symbol函数都会创建一个唯一的,独一无二的值。
let sym1 = Symbol('description');
let sym2 = Symbol('description');
console.log(sym1 === sym2); // 输出: false
2、不可修改性
symbol类型的值是不可变的,一旦创建就不能修改。
3、隐式属性
symbol 类型的值可以用作对象的属性名,这些属性不会出现在对象的枚举属性中,也不会被 for...in
循环或 Object.keys
方法枚举。
let sym = Symbol('description');
let obj = {};
obj[sym] = 'value';for (let key in obj) {console.log(key); // 不会输出 sym
}console.log(Object.keys(obj)); // 输出: []
三、什么是浅拷贝什么是深拷贝?
1、浅拷贝
浅拷贝是指对基本数据类型的拷贝,和对复杂数据类型的地址的拷贝,比如Object.assign()和拓展运算符...进行的对象拷贝都是对象的浅拷贝,基本数据类型是存储在内存的栈中,复杂数据类型则是存储在堆中,而栈只是存储了这个数据的地址,所以浅拷贝复杂数据类型只是拷贝了它的地址,一处修改多处同步。
2、深拷贝
深拷贝是指对复杂数据类型的值进行拷贝,主要的深拷贝方法有:
Ⅰ、JSON.parse(JSON.stringify(对象));
原理是将对象转化成json字符串,再将json解析成新的对象,因为 JSON 字符串是对象的完整表示,包括其所有嵌套属性。
这个方式有几个缺陷:
①、不支持函数
JSON.stringify 不会处理函数,函数在转换为 JSON 字符串时会被忽略。
let original = {name: 'Alice',sayHello: function() {console.log('Hello!');}
};
let deepCopy = JSON.parse(JSON.stringify(original));
console.log(deepCopy.sayHello); // 输出: undefined
②、不支持undefined
JSON.stringify 不会处理 undefined 值,undefined 在转换为 JSON 字符串时会被忽略。
let original = {name: 'Alice',age: undefined
};
let deepCopy = JSON.parse(JSON.stringify(original));
console.log(deepCopy.age); // 输出: undefined
③、不支持symbol
JSON.stringify 不会处理 symbol 类型的值,symbol 在转换为 JSON 字符串时会被忽略。
let original = {name: 'Alice',[Symbol('id')]: 123
};
let deepCopy = JSON.parse(JSON.stringify(original));
console.log(deepCopy[Symbol('id')]); // 输出: undefined
④、不支持循环引用
JSON.stringify 不会处理循环引用的对象,循环引用的对象在转换为 JSON 字符串时会抛出错误。
let original = {};
original.self = original;
try {let deepCopy = JSON.parse(JSON.stringify(original));
} catch (error) {console.error('循环引用错误:', error);
}
Ⅱ、递归函数
自己写递归函数。
function deepCopy(obj, visited = new WeakMap()) {if (obj === null || typeof obj !== 'object') {return obj;}if (visited.has(obj)) {return visited.get(obj);}let copy;if (Array.isArray(obj)) {copy = [];visited.set(obj, copy);obj.forEach((item, index) => {copy[index] = deepCopy(item, visited);});} else {copy = {};visited.set(obj, copy);Object.keys(obj).forEach(key => {copy[key] = deepCopy(obj[key], visited);});}return copy;
}
Ⅲ、第三方库
使用第三方库(如 lodash
的 _.cloneDeep
方法)进行深拷贝。
const _ = require('lodash');
let deepCopy = _.cloneDeep(original);
四、vue2的生命周期?
1、beforeCreate
- 在实例初始化之后,数据观测(data observer)和事件/侦听器(event/watcher)尚未设置之前被调用。
2、ceated
- 在实例已经完成数据观测(data observer)、属性和方法的运算、事件/侦听器的设置之后被调用,但挂载(mounting)还没开始,
$el
属性目前不可用。
3、beforeMount
- 在挂载开始之前被调用:相关的
render
函数首次被调用。
4、mounted
el
被新创建的vm.$el
替换,并挂载到实例上去之后调用该钩子。如果root
实例挂载了一个文档内元素,当mounted
被调用时vm.$el
也在文档内。
5、beforeUpdate
- 数据更新时调用,发生在虚拟 DOM 打补丁之前。这里适合在更新之前访问现有的 DOM,比如手动移除已添加的事件监听器。
6、updated
- 由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子。
- 当这个钩子被调用时,组件 DOM 已经更新,所以你可以执行依赖于 DOM 的操作。然而在大多数情况下,你应该避免在此期间更改状态。如果要相应状态改变,通常最好使用计算属性或侦听器 (watcher) 而不是此钩子。
7、beforeDestroy
- 实例销毁之前调用。在这一步,实例仍然完全可用。
8、destroyed
- 实例销毁之后调用。调用后,Vue 实例指示的所有绑定都会解除,所有的子实例也会被销毁。
9、activated
keep-alive
组件激活时调用。
10、deActivated
keep-alive
组件停用时调用。
五、vue2中父子组件的生命周期调用顺序
遵循341法则,即父组件beforeCreate、父组件created、父组件beforeMount、子组件beforeCreate、子组件created、子组件beforeMount、子组件mounted、父组件mounted顺序。
六、vue3的生命周期
对比vue2的生命周期,vue3把befroeCreate和created变成了setup,其余的生命周期在前面加on就行。
七、vue3对比vue2的变化
1、Options选项式API和Composition组合式API
vue3依然兼容vue2的选项式API写法,data、methods、computed、watch分类来写,数据多了会频繁滚动,而组合式API把一个数据的声明和相关方法都集中到一块,便于管理。
2、响应式
vue2:
- 使用
Object.defineProperty
来实现响应式系统。 - 只能对基本数据类型和对象的直接属性进行响应式监听。
vue3:
- 使用 ES6 的
Proxy
来实现响应式系统。 - 可以对对象的深层次属性和数组进行响应式监听。
- 提供了
ref
和reactive
两种方式来定义响应式状态。
3、对于typeScript的支持
vue3对于typeScript的支持更加强大,不需要vue2使用ts的额外配置。
4、根元素的支持
vue2不允许多个根元素的出现,必须用一个div去包裹同级的多个div,而vue3允许template下面多个同级div。
5、新增指令
- 引入了新的 API 和工具,如
Teleport
组件用于将组件的内容渲染到 DOM 树的其他位置。 - 提供了
Suspense
组件用于处理异步组件的加载状态。 - 引入了
Fragment
,允许组件的模板返回多个根元素。
<!-- Teleport -->
<template><teleport to="body"><div>This is a teleported content</div></teleport>
</template><!-- Suspense -->
<template><suspense><template #default><async-component /></template><template #fallback><div>Loading...</div></template></suspense>
</template><!-- Fragment -->
<template><><p>First element</p><p>Second element</p></>
</template>
八、组合式API中的ref和reactive是什么?
ref
:用于创建单个响应式值,适用于简单的响应式状态管理。可以存储任何类型的值,并在模板中自动解包。-
<template><div><p>{{ message }}</p><button @click="updateMessage">更新消息</button></div> </template><script> import { ref } from 'vue';export default {setup() {// 使用 ref 创建一个响应式变量const message = ref('Hello, Vue 3!');// 定义一个方法来更新消息const updateMessage = () => {message.value = '消息已更新!';};// 返回需要在模板中使用的变量和方法return {message,updateMessage};} }; </script>
reactive
:用于创建包含多个响应式属性的对象,适用于复杂的响应式状态管理。所有嵌套属性都是响应式的,但只能用于对象。-
<template><div><p>{{ user.name }}</p><p>{{ user.age }}</p><button @click="updateUser">更新用户信息</button></div> </template><script> import { reactive } from 'vue';export default {setup() {// 使用 reactive 创建一个响应式对象const user = reactive({name: 'Alice',age: 25});// 定义一个方法来更新用户信息const updateUser = () => {user.name = 'Bob';user.age = 30;};// 返回需要在模板中使用的变量和方法return {user,updateUser};} }; </script>
九、什么是闭包?
简单来说,闭包是一个函数内嵌套并返回一个函数,这个嵌套的函数使用了外部函数的变量就形成了闭包。
- 优点:
不会对全局变量造成污染,因为它用的是函数内声明的私有变量;
让数据私有化并可以返回出去外部操作,但这其实是函数的特性,在函数中声明变量就是在私有化变量,return就是在输出一个返回值;
可以让这个私有变量长时间存在于内存中,避免了这个私有变量被垃圾回收机制自动销毁;
- 缺点:
由于私有变量不会被垃圾回收机制自动销毁,可能会造成内存泄漏;
需要手动销毁闭包;
function fn() {let a = 10;return function() {a++;console.log(a)}
}let f = fn();
f();
f();
f();
f = null;
// 这里的fn()就是一个外部函数,声明了一个私有变量a并赋值为10,并且返回了一个内部函数,这个内部函数操作变量a自增,这就是闭包
// 由于函数fn()是有返回值的,所以声明一个f来接收fn()的返回值,此时这个f就是fn()的内部函数,再调用3次f(),输出结果是11,12,13
// 这表明了a变量没有被自动销毁,依然留存在内存中,下次调用不会使a恢复到初始值,所以记得要手动销毁闭包来释放变量a的内存占用,即f=null
值得一提的是,闭包可以用在创建工厂函数上,来生成具有特定行为的函数:
function createMultiplier(multiplier) {return function(num) {return num * multiplier;};
}const double = createMultiplier(2);
const triple = createMultiplier(3);console.log(double(5)); // 输出: 10
console.log(triple(5)); // 输出: 15
十、什么是垃圾回收机制
垃圾回收机制是 JavaScript 引擎用来自动管理内存的一种机制。它的主要任务是找到不再使用的对象并释放其占用的内存,以避免内存泄漏。
两种常见的垃圾回收算法:
1、标记-清除算法
- 标记阶段:从根对象(如全局对象)开始,递归地标记所有可达的对象。
- 清除阶段:清除所有未标记的对象,释放其占用的内存。
2、引用计数算法
这种算法通过计数每个对象的引用数来管理内存。当引用计数为零时,对象将被回收。
垃圾回收机制不会对闭包用到的变量内存进行回收。
十一、
相关文章:
2024前端面试题(持续更新)
目录 一、js的数据类型有哪些? 二、什么是symbol? 三、什么是浅拷贝什么是深拷贝? 四、vue2的生命周期? 五、vue2中父子组件的生命周期调用顺序 六、vue3的生命周期 七、vue3对比vue2的变化 八、组合式API中的ref和reactiv…...
apache转nginx访问变成下载解决方法
在配置文件 nginx.conf中存在 第一行: include mine.types 对应了文件的mime类型。 第二行: 默认的是octet-stream, 意思是如果一个文件的mime类型不存在就会使用默认的类型。 通常是这个导致了文件的下载。 第一种方案:(推荐&a…...

【iOS】OC高级编程 iOS多线程与内存管理阅读笔记——自动引用计数(三)
目录 ARC规则 概要 所有权修饰符 __strong修饰符 __weak修饰符 __unsafe_unretained修饰符 __autoreleasing修饰符 ARC规则 概要 “引用计数式内存管理”的本质部分在ARC中并没有改变,ARC只是自动地帮助我们处理“引用计数”的相关部分。 在编译单位上可以…...

Oracle数据库使用dblink是时出现 ORA-12170:TNS:连接超时
原因: 我遇到这种情况是因为dblink那端的数据库被我重新导了一下dmp,然后本地这边查询就报错了。 解决办法: 把已有的dblink删掉或者说是换个名字,然后按照原来的再新建一个同名的dblink就解决了。...
OpenHarmony系统中实现Android虚拟化、模拟器相关的功能,包括桌面显示,详细解决方案
在 OpenHarmony 系统中实现 Android 虚拟化 和 模拟器功能(面显包括桌示)是一个复杂的任务,涉及多个关键技术栈的集成和深度定制。我们可以通过多种方式来实现 Android 系统的虚拟化和模拟器功能,类似于在普通操作系统中运行虚拟机…...

决策曲线分析(DCA)中平均净阈值用于评价模型算法(R自定义函数)
决策曲线分析(DCA)中平均净阈值用于评价模型算法 DCA分析虽然不强调用来评价模型算法或者变量组合的优劣,但是实际应用过程中感觉DCA曲线的走势和模型的效能具有良好的一致性,其实这种一致性也可以找到内在的联系,比如…...

《经验分享 · 软考系统分析师》
📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…...
记录一下 js encodeURI和encodeURIComponent URL转码问题
escape:由于它已经被废弃,不建议在任何新的代码中使用。encodeURI:当你需要对整个URI进行编码时使用,例如在将整个URL作为参数传递时。encodeURIComponent:当你需要编码URI中的某一部分,尤其是查询字符串参…...
【C语言】二维前缀和/求子矩阵之和
相信你是最棒哒!!! 目录 一、题目描述 正确代码 二、题目描述 题目代码 总结 一、题目描述 输入一个 𝑛 行 𝑚 列的整数矩阵,再输入 𝑞个询问,每个询问包含四个整数 𝑥1…...

SRS 服务器入门:实时流媒体传输的理想选择
在当今视频流媒体需求爆炸式增长的时代,如何选择一款高效、稳定且功能强大的流媒体服务器成为了许多开发者和企业关注的焦点。而 SRS(Simple Realtime Server)作为一款开源的流媒体服务器,以其卓越的性能和灵活的功能,…...

【ETCD】【源码阅读】configurePeerListeners() 函数解析
configurePeerListeners 是 ETCD 的一个核心函数,用于为集群中节点之间的通信配置监听器(Peer Listener)。这些监听器主要负责 Raft 协议的消息传递、日志复制等功能。函数返回一个包含所有监听器的列表。 函数签名 func configurePeerList…...

1_ssrf总结
content 什么是ssrf?简介原理 危害利用内网访问端口扫描fsockopenurlbypass127.0.0.0被禁止绕过302跳转DNS重绑定绕过 file协议dict协议gopher协议主从复制打redis打mysql打fastcgi协议打未授权redis Defence 什么是ssrf? 简介 SSRF(Server-Side Request Forger…...
深入解析 Redis
1. 为什么 Redis 性能至关重要? 在现代分布式应用中,Redis 被广泛作为缓存系统、消息队列、实时数据存储和会话管理等多种场景的解决方案。作为一个高性能的内存数据库,Redis 的设计理念是提供低延迟和高吞吐量的操作。然而,当 R…...

Visual Studio 2022发布UWP应用证书绑定失败
最近发布UWP应用时,卡在了关联产品这步,一直提示网络链接问题,获取不到产品信息。创建新项目也是这样,猜测低版本的VS不支持发布UWP应用了,便升级到了VS2022。VS2022创建新UWP工程确实可以关联发布应用,并成…...

K8S对接ceph的RBD块存储
1 PG数量限制问题 1.1 原因分析 1.还是老样子,先创建存储池,在初始化为rbd。 [rootceph141~]# ceph osd pool create wenzhiyong-k8s 128 128 Error ERANGE: pg_num 128 size 3 for this pool would result in 295 cumulative PGs per OSD (2067 tot…...

ragflow连不上ollama的解决方案
由于前期wsl默认装在C盘,后期部署好RagFlow后C盘爆红,在连接ollama的时候一直在转圈圈,问其他人没有遇到这种情况,猜测是因为内存不足无法加载模型导致,今天重新在E盘安装wsl 使用wsl装Ubuntu Win11 wsl-安装教程 如…...

ACL与Prefix List(前缀列表)
匹配工具一般搭配其他操作,可实现NAT,路由策略,策略路由,MQC,流量过滤等操作 通配符掩码 我们都知道子网掩码的1是精确匹配,1是大致匹配,1必须连续 我们也知道反掩码的1是大致匹配࿰…...

OpenSSH和OpenSSL升级
需求 centos7.9升级SSH和SSL OpenSSH升级为openssh9.8 OpenSSL升级为openssl-3.4.0 下载openssh最新版本与openssl对应版本 openssh最新版本下载地址 wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.8p1.tar.gzOpenSSL下载地址 这里下载的是3.4.0 wg…...
数据库继续学习
数据库中的外键约束的作用是什么? 外键约束用于在多表操作中保证数据的一致性、完整性和正确性。它确保引用的数据在主表中存在,从而避免孤立记录的出现。 物理外键与逻辑外键的选择? 推荐使用逻辑外键。逻辑外键是指在应用程序层面上实现外键…...
车载以太网-UDPNM
文章目录 UDPNM定义在车载以太网中的作用网络节点状态监测唤醒和睡眠管理网络拓扑发现工作流程消息发送消息接收与处理与其他车载网络协议的比较和协作UDPNM的工作原理是什么?1.消息构建与发送原理消息格式构建发送机制2.消息接收与响应原理接收过程响应机制3.状态管理与定时器…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...

【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...