前端面试题(十五)
83. ES6 中的 let 和 const
- let 和 const 的区别是什么?
-
let 和 const 是 ES6 引入的用于声明变量的新方式,相比于传统的 var,它们具有以下特性:
- 块级作用域:
let和const声明的变量在其所在的块级作用域内有效,不会在作用域外被访问到。 - 变量提升不同:虽然 let 和 const 也有变量提升,但在提升过程中,声明的变量不会初始化,因此在声明前使用会抛出
ReferenceError,这被称为 暂时性死区 (Temporal Dead Zone)。 - 不可重复声明:在同一作用域内,不能使用 let 或 const 重复声明同名变量。
- const 用于声明常量,必须在声明时初始化,且不能重新赋值,但对象和数组的属性可以改变。
- 块级作用域:
-
示例:
// let 的块级作用域 if (true) {let x = 10;console.log(x); // 10 } console.log(x); // ReferenceError: x is not defined// const 的不可变性 const y = 20; y = 30; // TypeError: Assignment to constant variable.// const 对象的属性可修改 const obj = { name: 'Alice' }; obj.name = 'Bob'; // 合法 console.log(obj.name); // 'Bob'
-
84. Promise 工作原理
-
Promise 是什么?
-
Promise 是用于处理异步操作的对象,它代表一个将来可能完成或失败的操作及其结果。Promise 有三种状态:
- Pending(进行中):初始状态,操作尚未完成。
- Fulfilled(已成功):操作成功完成。
- Rejected(已失败):操作失败。
-
Promise 的基本用法:
const promise = new Promise((resolve, reject) => {setTimeout(() => {resolve('成功');}, 1000); });promise.then((result) => {console.log(result); // '成功' }).catch((error) => {console.log(error); });
-
-
Promise.all 和 Promise.race 的区别?
-
Promise.all:接受一个包含多个 Promise 的数组,只有当所有 Promise 都成功时,它才会
resolve,如果其中一个 Promise 失败,它就会reject。- 示例:
const p1 = Promise.resolve('成功1'); const p2 = Promise.resolve('成功2'); const p3 = Promise.reject('失败');Promise.all([p1, p2, p3]).then((results) => {console.log(results);}).catch((error) => {console.log(error); // '失败'});
- 示例:
-
Promise.race:也是接受一个包含多个 Promise 的数组,但只要有一个 Promise 完成(无论是
resolve还是reject),它就会返回那个 Promise 的结果。- 示例:
const p1 = new Promise((resolve) => setTimeout(resolve, 500, '成功1')); const p2 = new Promise((resolve) => setTimeout(resolve, 100, '成功2'));Promise.race([p1, p2]).then((result) => {console.log(result); // '成功2' });
- 示例:
-
85. React 生命周期
-
React 的生命周期有哪些?
React 的组件生命周期分为三个阶段:挂载阶段、更新阶段 和 卸载阶段。-
挂载阶段 (Mounting):
- 当组件被创建并插入 DOM 时会触发以下钩子函数:
constructor():用于初始化状态和绑定方法。componentDidMount():在组件挂载后执行,通常用于发送网络请求或操作 DOM。
- 当组件被创建并插入 DOM 时会触发以下钩子函数:
-
更新阶段 (Updating):
- 当组件的 props 或 state 发生变化时会触发:
shouldComponentUpdate(nextProps, nextState):用于判断是否需要重新渲染组件,返回true则重新渲染,返回false则跳过。componentDidUpdate(prevProps, prevState):在更新完成后执行,通常用于 DOM 操作或发起依赖于更新的数据请求。
- 当组件的 props 或 state 发生变化时会触发:
-
卸载阶段 (Unmounting):
- 当组件即将被移除时,会调用
componentWillUnmount(),通常用于清理定时器、取消网络请求等操作。
- 当组件即将被移除时,会调用
- 示例:
class MyComponent extends React.Component {constructor(props) {super(props);this.state = { count: 0 };}componentDidMount() {console.log('组件已挂载');}componentDidUpdate(prevProps, prevState) {console.log('组件已更新');}componentWillUnmount() {console.log('组件即将卸载');}render() {return <div>{this.state.count}</div>;} }
-
86. Vue 生命周期
-
Vue 的生命周期有哪些?
Vue 的生命周期同样分为 创建阶段、挂载阶段、更新阶段 和 销毁阶段,并提供相应的钩子函数:-
创建阶段:
beforeCreate():实例初始化之后,数据观测和事件配置之前。created():实例已经创建完成,数据观测和事件配置已经完成,但 DOM 尚未挂载。
-
挂载阶段:
beforeMount():在挂载之前被调用,此时模板编译完成,但尚未插入 DOM。mounted():在组件挂载到 DOM 后调用,通常用于 DOM 操作或 AJAX 请求。
-
更新阶段:
beforeUpdate():当数据更新时调用,但在虚拟 DOM 重新渲染和打补丁之前。updated():组件更新完毕后调用。
-
销毁阶段:
beforeDestroy():实例销毁之前调用,可以在此清理事件监听器等。destroyed():实例销毁后调用,所有绑定的事件和数据观察者都会移除。
- 示例:
new Vue({data() {return { message: 'Hello Vue' };},beforeCreate() {console.log('beforeCreate');},created() {console.log('created');},beforeMount() {console.log('beforeMount');},mounted() {console.log('mounted');},beforeUpdate() {console.log('beforeUpdate');},updated() {console.log('updated');},beforeDestroy() {console.log('beforeDestroy');},destroyed() {console.log('destroyed');} });
-
87. 深拷贝和浅拷贝
- 什么是深拷贝和浅拷贝?
-
浅拷贝:只复制对象的引用,而不是复制对象本身。如果拷贝后的对象发生改变,原对象也会受到影响。
- 常见浅拷贝的方法:
Object.assign()、Array.slice()。 - 示例:
const obj1 = { a: 1, b: { c: 2 } }; const obj2 = Object.assign({}, obj1); obj2.b.c = 3; console.log(obj1.b.c); // 3,原对象的 b 也被修改了
- 常见浅拷贝的方法:
-
深拷贝:完全复制一个新的对象,修改拷贝后的对象不会影响原对象。
- 常见深拷贝的方法:
JSON.parse(JSON.stringify())(但不支持函数和 undefined)。 - 示例:
const obj1 = { a: 1, b: { c: 2 } }; const obj2 = JSON.parse(JSON.stringify(obj1)); obj2.b.c = 3; console.log(obj1.b.c); // 2,原对象不受影响
- 常见深拷贝的方法:
-
88. 冒泡排序
-
冒泡排序是什么?
冒泡排序 是一种简单的排序算法,它通过重复遍历待排序的列表,相邻元素两两比较并交换,最终将最大或最小的元素“冒泡”到列表的一端。 -
冒泡排序的时间复杂度:
O(n^2),适用于小规模数据
排序。
- 示例:
function bubbleSort(arr) {const len = arr.length;for (let i = 0; i < len; i++) {for (let j = 0; j < len - 1 - i; j++) {if (arr[j] > arr[j + 1]) {[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]; // 交换}}}return arr; }console.log(bubbleSort([5, 3, 8, 4, 2])); // [2, 3, 4, 5, 8]
相关文章:
前端面试题(十五)
83. ES6 中的 let 和 const let 和 const 的区别是什么? let 和 const 是 ES6 引入的用于声明变量的新方式,相比于传统的 var,它们具有以下特性: 块级作用域:let 和 const 声明的变量在其所在的块级作用域内有效&…...
如何成为 Rust 核心贡献者?Rust 开发的核心是什么?Rust 重要技术专家揭秘
10 月 17 - 18日,由 GOSIM 开源创新汇主办、CSDN 承办的 GOSIM CHINA 2024 将在北京盛大启幕。作为 GOSIM 开源年度大会的第三届盛会,本次活动邀请了 60 多位国际开源专家,汇聚了来自全球百余家顶尖科技企业、知名高校及开源社区的技术大咖、…...
springboot + nacos + sofarpc 整合后报错403
springboot版本 2.2.2 nacos 版本 1.4.2 rpc-sofa-boot 版本 3.2.0 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.2.RELEASE</version></parent>…...
小米路由器R3Gv2安装openwrt记录
前言 小米路由器R3Gv2的硬件配置与小米路由器4A千兆版一致,但bootloader有所不同,因此openwrt的固件不要互刷。另外,R3Gv2和R3G、4A百兆版是不同的设备,切勿混淆。 硬件信息 OpenWrt参数页-Xiaomi MiWiFi 3G v2 CPU:…...
记录一下,android studio 登录不上github的问题
android studio 2023.3.1.18 版本的编译器,出现问题,之前连接过的项目可以正常提交和拉取到github。 但是新建立的项目无法上传到github,提示错误cannot load information for github.com/:request response;access to this site,…...
springcloud之基于github webhook动态刷新服务配置
前言 在实际开发中经常会有一个叫做配置中心的服务,这个服务经过变更参数来动态刷新线上业务数据行为配置。比如;行为开关、活动数据、黑白名单、本地/预发/线上环境切换等等,这些配置信息往往需要在我们不重启系统的时候就可以被更新执行。那…...
qt+opengl 实现纹理贴图,平移旋转,绘制三角形,方形
1 首先qt 已经封装了opengl,那么我们就可以直接用了,这里面有三个函数需要继承 virtual void initializeGL() override; virtual void resizeGL(int w,int h) override; virtual void paintGL() override; 这三个函数是实现opengl的重要函数。 2 我们…...
【动态规划】子数组系列(下)
1. 等差数列划分 413. 等差数列划分 状态表示:以 i 位置为结尾时的等差数列的个数 状态转移方程:由于至少需要三个元素才符合题目中等差数列的要求,所以需要判断 i - 2,i - 1,i 三个元素,当这三个元素符合…...
macos mendeley Unable to install the Microsoft Word Plugin 解决
windows也是相似的原理,这里主要说macos, 本质是 找到mendeley的插件启动项,放在word启动目录下, GPT-o1的解决方案: 3. Manual Installation (If Automatic Installation Fails) If the automatic installation doe…...
【Linux进程间通信】Linux信号机制深度解析:保存与处理技巧
📝个人主页🌹:Eternity._ ⏩收录专栏⏪:Linux “ 登神长阶 ” 🌹🌹期待您的关注 🌹🌹 ❀Linux进程间通信 📒1. 信号的保存🌊在内核中的表示🍂sigs…...
常见开源组件的详解
文章目录 RPCRPC架构和工作流程为什么有了HTTP还要用RPC底层协议数据格式连接管理错误处理 使用场景常见的RPC框架 Web应用框架主要功能常见的Web应用框架Spring Boot (Java)Django (Python)Express.js (Node.js) Redis主要特点应用场景缓存问题Redis集群架构主从复制Redis Clu…...
rust使用教程详解
欢迎来到 Rustlings。该项目包含一些小练习,让您习惯阅读和编写 Rust 代码。这包括阅读和响应编译器消息! 建议在阅读Rust 官方书籍(学习 Rust 最全面的资源)的同时做 Rustlings 练习 📚️ Rust By Example是另一个推…...
并查集的实现(朴素版)
这是C算法基础-数据结构专栏的第二十九篇文章,专栏详情请见此处。 由于作者即将参加CSP,所以到比赛结束前将不再发表文章! 引入 并查集是一种可以快速合并查找集合的一种数据结构,这次我们将通过三道题来详细讲解并查集ÿ…...
WPF 为button动态设置不同的模板
有时候需要动态的设置一些按钮的状态模板。使一个button显示不同的内容,比如Button未点击安装显示: 安装后显示: 可以通过设置button的content,通过content来设置不同的模板来实现功能,以下是代码: MainWi…...
【C++贪心 DFS】2673. 使二叉树所有路径值相等的最小代价|1917
本文涉及知识点 C贪心 反证法 决策包容性 CDFS LeetCode2673. 使二叉树所有路径值相等的最小代价 给你一个整数 n 表示一棵 满二叉树 里面节点的数目,节点编号从 1 到 n 。根节点编号为 1 ,树中每个非叶子节点 i 都有两个孩子,分别是左孩子…...
虚幻引擎GAS入门学习笔记(一)
虚幻引擎GAS入门(一) Gameplay Ability System(GAS) 是一个模块化且强大的框架,用于管理虚幻引擎中的游戏玩法逻辑。它的核心组成部分包括 Gameplay Ability(定义和执行能力)、Gameplay Effect(应用和管理…...
Excel:vba实现合并工作表(表头相同)
这个代码应该也适用于一些表头相同的工作表的汇总,只需要修改想要遍历的表,适用于处理大量表头相同的表的合并 这里的汇总合并表 total 是我事先创建的,我觉得比用vba代码创建要容易一下,如果不事先创建汇总表就用下面的代码&…...
Redis:分布式 - 主从复制
Redis:分布式 - 主从复制 概念配置主从模式info replicationslave-read-onlytcp-nodelay 命令slaveof 主从结构一主一从一主多从 主从复制流程数据同步命令全量同步部分同步实时同步 节点晋升 概念 Redis的最佳应用,还是要在分布式系统中。对于非分布式…...
el-date-picker设置只有某些日期可选
示例图: <el-date-pickerv-model"topFormObj.upTime"type"date"value-format"timestamp"format"dd/MM/yyyy":picker-options"pickerOptions" /> 固定限制每周的周末周三不可选 data() {return {pickerOp…...
java数据库操作-cnblog
创建lib目录,填入jar包 选择 libraries添加lib目录 package nb;import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException;public class JDBCtest {private static final String url "jdbc:mysql://localhost:3306/test?c…...
3步搞定ViGEmBus:Windows虚拟游戏手柄驱动终极指南 [特殊字符]
3步搞定ViGEmBus:Windows虚拟游戏手柄驱动终极指南 🎮 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 想要在Windows上体验更丰富的游…...
服务器频繁报soft lockup?手把手教你排查高负载进程与内核死锁问题
服务器频繁报soft lockup?手把手教你排查高负载进程与内核死锁问题 最近在运维工作中,你是否遇到过服务器突然弹出"kernel:NMI watchdog: BUG: soft lockup - CPU#X stuck for XXs!"这样的警告信息?这种内核软死锁问题看似不会立即…...
2026年隧道代理技术解析与主流服务商测评
凌晨两点,某美妆品牌运营小李被手机告警震醒——大促期间的竞品价格采集任务又断了。日志里满是403报错,手动切换了几个代理IP,任务勉强恢复,可第一波流量高峰的数据已经错过了。这不是小李第一次遇到这种麻烦,也不是个…...
AI写论文不再难,4款AI论文生成工具带你开启高效写作之旅!
在2025年愈演愈烈的学术写作智能化趋势中,越来越多的人选择借助AI写论文工具。现实中许多这样的工具在撰写硕士、博士论文等长篇学术作品时,常常缺乏必要的理论深度,逻辑也显得比较松散。普通的AI论文写作工具显然无法满足这些专业写作的需求…...
深入解析服务器License管理:从基础命令到实战应用
1. 服务器License管理:为什么它比你想的更重要 如果你管理过服务器,尤其是那些运行着像CAD、EDA、仿真分析这类专业软件的服务器,那你肯定对“License”这个词不陌生。它就像软件的“通行证”,没有它,再强大的硬件也只…...
项目分享|LLM驱动的多市场股票智能分析器
项目分享|LLM驱动的多市场股票智能分析器 引言 在股票投资分析中,实时行情跟踪、多维度数据解析和科学决策判断是核心需求,而个人投资者往往面临数据分散、分析耗时、缺乏专业工具的问题。由ZhuLinsen开源的daily_stock_analysis项目完美解决了这些痛点…...
同花顺期货通指标编写指南:从零开始构建趋势波段共振系统(含避坑技巧)
同花顺期货通指标编写指南:从零开始构建趋势波段共振系统(含避坑技巧) 在期货交易中,技术指标是交易者不可或缺的分析工具。同花顺期货通作为国内主流的期货交易软件,其内置的指标编写功能为交易者提供了强大的自定义能…...
计算机毕业设计springboot英语学习网站 基于SpringBoot的在线英语教育平台设计与实现 SpringBoot框架下的智能化英语辅助学习系统开发
计算机毕业设计springboot英语学习网站3i8387gp (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。全球化时代对英语能力的需求日益增长,信息技术在教育领域的广泛应用推…...
MyBatis-Plus中queryWrapper和lambdaQueryWrapper的eq方法实战对比:哪个更适合你的项目?
MyBatis-Plus中QueryWrapper与LambdaQueryWrapper的eq方法深度解析与实战选型指南 在Java持久层框架领域,MyBatis-Plus作为MyBatis的增强工具,其Wrapper条件构造器一直是开发者构建动态SQL的利器。其中eq方法作为最基础也是最常用的条件构造方法…...
TI AM64x设备树配置踩坑记:从pinctrl节点到SysConfig工具的避坑指南
TI AM64x设备树配置实战:从寄存器解读到SysConfig高效开发 第一次在AM64x平台上配置外设引脚时,我盯着设备树里那行AM64X_IOPAD(0x011c, PIN_OUTPUT, 7)发呆了半小时——这个神秘的十六进制数到底对应哪个物理引脚?最后的数字7又代表什么&…...
