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.状态管理与定时器…...
网页核心页面设计(第8章)
一、伪元素 伪元素是 CSS 中的一种选择器,用于选择某些特定的元素或元素的一部分,而这些元素本身并不存在于文档的结构中。伪元素使得网页设计师可以更灵活地控制样式,从而可以为元素的内容、框架或文本提供额外的样式,增强网页的…...
在PowerShell下运行curl命令出现错误:Invoke-WebRequest : 无法处理参数,因为参数名称“u”具有二义性
今天在Windows 11下测试Nanamq的HTTP API,按照其文档输入: curl -i --basic -u admin:public -X GET "http://localhost:8081/api/v4/subscriptions" 结果出现二义性错误: 而且输入curl --help命令想看看参数说明的时候ÿ…...
医疗花费预测——协方差矩阵和热力图
引言 在医疗数据分析中,预测个人的医疗花费是一个重要的课题。这不仅有助于个人健康管理,也为医疗资源的合理分配提供了数据支持。本篇博客,我们将探讨如何利用协方差矩阵和热力图来分析和预测个人的医疗花费。我们将以DataFountain提供的数…...
react antd tabs router 基础管理后台模版
在构建 React 后台管理系统时,使用标签页的方式展示路由是一种高效且用户友好的设计模式。这种实现方式通常允许用户在多个页面之间快速切换,并保留页面的状态,类似于浏览器的多标签页功能。 需求分析 1.动态标签页:根据用户的导…...
【数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
目录😋 任务描述 相关知识 测试说明 我的通关代码: 测试结果: 任务描述 本关任务:编写一个程序实现环形队列的基本运算。 相关知识 为了完成本关任务,你需要掌握: 初始化队列、销毁队列、判断队列是否为空、进队列…...
【数据结构——栈与队列】链栈的基本运算(头歌实践教学平台习题)【合集】
目录😋 任务描述 相关知识 测试说明 我的通关代码: 测试结果: 任务描述 本关任务:编写一个程序实现链栈的基本运算。 相关知识 为了完成本关任务,你需要掌握: 初始化栈、销毁栈、判断栈是否为空、进栈、出栈、取栈…...
GIT CLONE ERROR: remote: [session-ec426a86] Access denied
报错信息: remote: [session-ec426a86] Access denied 错误原因: 1.更换了不同的GIT仓或者账号 2.之前设置了默认账号密码信息 3. git init 只初始化了GIT项目,并没有清空原有的账号密码配置 处理方法: win11需要到个人文件…...
GitHub 正式收录 MoonBit 作为一门通用编程语言!核心用户突破三万!
MoonBit 编程语言正式被 Github 收录!这对于一个仅有两年发展时间的编程语言来说是一种高度认可,期待未来由 MoonBit 编写的项目数量快速增长,早日成为首个由国人研发迈进 10 万➕ 用户的编程语言。 最近用户数已经接近 3 万(数据…...
PHP中GD库的使用
由于我要用到php的验证码 <?php session_start();// 生成验证码 $random_code substr(md5(uniqid(mt_rand(), true)), 0, 6);// 将验证码保存到 session 中 $_SESSION[captcha] $random_code;// 创建图片 $font 6; $image_width 100; $image_height 40;// 创建图像 $…...
docker安装Elasticsearch和Kibana
上传文件 加载tar包 安装 1.安装elasticsearch 通过下面的Docker命令即可安装单机版本的elasticsearch: docker run -d \--name es \-e "ES_JAVA_OPTS-Xms512m -Xmx512m" \-e "discovery.typesingle-node" \-v es-data:/usr/share/elastics…...
怎么看网站有没有做推广/公众号seo排名优化
目前有js和png图片2种方式,也就是说msn的用户也可以happy的使用。背景、字体颜色都可以自己设置,肯定能弄出跟你blog统一的风格。详细的介绍在这里:http://www.cnbeta.com/modules.php?nameNews&filearticle&sid12220 转载于:https:…...
营销型网站建设需要有什么功能/百度竞价排名服务
siwtch(config)#service timestamps debug datetime msec localtime show-timezonesiwtch(config)#service timestamps log datetime msec localtime show-timezone...
wordpress如何设置301/武汉企业seo推广
模板介绍 精美PPT模板设计,淡雅个人简历自我介绍PPT模板。一套个人简历幻灯片模板,内含蓝色多种配色,精美风格设计,动态播放效果,精美实用。 一份设计精美的PPT模板,可以让你在汇报演讲时脱颖而出。 希望…...
东莞网站建设营销哪家好/排名网站
React学习01React简介React的特点React第一个例子虚拟DOM的两种创建方式虚拟DOM与真实DOM的区别JSXJSX练习模块与组件函数式组件类式组件组件属性stateReact事件bind的使用setState的使用state的简写方式props使用state进行实现(不建议使用)使用props批量传递props对props进行限…...
怎么网站建设多少钱/百度网站怎么提升排名
今天在调试项目的时候使用SqlServer遇到了上面的错误: 我像管理员表中插入数据: inert into Admin vlues(1,liu,123) 在结果窗口中显示了:仅当使用了列的列表,并且 IDENTITY_INSERT 为 ON 时,才能在表 Admin 中为标识列…...
做网站如何突出网站特色/百度收录要多久
CentOS5、6系统的启动流程基于Intel X86架构平台的系统启动流程:1.POST:Power-On Self Testing,加电自检;CMOS:在这里面有一个EPROM,可擦写可编程的只读存储器;在这里面保存了一小段程序叫做BIO…...