前端面试题(十五)

devtools/2024/10/22 10:45:51/

83. ES6 中的 let 和 const

  • let 和 const 的区别是什么?
    • letconst 是 ES6 引入的用于声明变量的新方式,相比于传统的 var,它们具有以下特性:

      1. 块级作用域letconst 声明的变量在其所在的块级作用域内有效,不会在作用域外被访问到。
      2. 变量提升不同:虽然 letconst 也有变量提升,但在提升过程中,声明的变量不会初始化,因此在声明前使用会抛出 ReferenceError,这被称为 暂时性死区 (Temporal Dead Zone)
      3. 不可重复声明:在同一作用域内,不能使用 letconst 重复声明同名变量。
      4. 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 有三种状态:

      1. Pending(进行中):初始状态,操作尚未完成。
      2. Fulfilled(已成功):操作成功完成。
      3. 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 的区别?

    1. 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); // '失败'});
        
    2. 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 的组件生命周期分为三个阶段:挂载阶段更新阶段卸载阶段

    1. 挂载阶段 (Mounting)

      • 当组件被创建并插入 DOM 时会触发以下钩子函数:
        • constructor():用于初始化状态和绑定方法。
        • componentDidMount():在组件挂载后执行,通常用于发送网络请求或操作 DOM。
    2. 更新阶段 (Updating)

      • 当组件的 props 或 state 发生变化时会触发:
        • shouldComponentUpdate(nextProps, nextState):用于判断是否需要重新渲染组件,返回 true 则重新渲染,返回 false 则跳过。
        • componentDidUpdate(prevProps, prevState):在更新完成后执行,通常用于 DOM 操作或发起依赖于更新的数据请求。
    3. 卸载阶段 (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 的生命周期同样分为 创建阶段挂载阶段更新阶段销毁阶段,并提供相应的钩子函数:

    1. 创建阶段

      • beforeCreate():实例初始化之后,数据观测和事件配置之前。
      • created():实例已经创建完成,数据观测和事件配置已经完成,但 DOM 尚未挂载。
    2. 挂载阶段

      • beforeMount():在挂载之前被调用,此时模板编译完成,但尚未插入 DOM。
      • mounted():在组件挂载到 DOM 后调用,通常用于 DOM 操作或 AJAX 请求。
    3. 更新阶段

      • beforeUpdate():当数据更新时调用,但在虚拟 DOM 重新渲染和打补丁之前。
      • updated():组件更新完毕后调用。
    4. 销毁阶段

      • 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. 深拷贝和浅拷贝

  • 什么是深拷贝和浅拷贝?
    1. 浅拷贝:只复制对象的引用,而不是复制对象本身。如果拷贝后的对象发生改变,原对象也会受到影响。

      • 常见浅拷贝的方法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 也被修改了
        
    2. 深拷贝:完全复制一个新的对象,修改拷贝后的对象不会影响原对象。

      • 常见深拷贝的方法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]
    

http://www.ppmy.cn/devtools/125532.html

相关文章

数据结构 ——— C语言实现带哨兵位双向循环链表

目录 前言 无哨兵位单向不循环链表的缺陷 带哨兵位双向循环链表的概念 带哨兵位双向循环链表的结构 带哨兵位双向循环链表逻辑结构示意图​编辑 实现带哨兵位双向循环链表的准备工作 实现带哨兵位双向循环链表 1. 创建新节点 2. 初始化哨兵位 3. 定义哨兵位指针 4. …

QD1-P23 CSS 基础选择器

本节学习&#xff1a;CSS 基础选择器&#xff08;5种&#xff09; 本节视频 https://www.bilibili.com/video/BV1n64y1U7oj?p23 基础选择器是 CSS 中最常用的选择器类型&#xff0c;它们用于选择 HTML 文档中的元素。以下是基础选择器的列表以及它们的优先级&#xff08;权重…

中国上市药品目录集数据库查询方法-支持数据下载

《中国上市药品目录集》由国家食品药品监督管理总局以数据库形式发布并实时更新&#xff0c;由CDE负责日常维护和管理。《中国上市药品目录集》收录了在中国批准上市的创新药、改良型新药、化学药品新注册分类的仿制药以及通过质量和疗效一致性评价的药品的具体信息。这个目录集…

XML 和 SimpleXML 简介

XML 和 SimpleXML 简介 XML(可扩展标记语言)是一种用于存储和传输数据的标记语言。它定义了一组规则,用于在文档中编码数据,以便人和机器都能理解。XML 的设计目标是既易于人类阅读,也易于机器解析。SimpleXML 是 PHP 中的一个扩展,用于处理 XML 数据。它提供了一个简单…

泡沫背后:人工智能的虚幻与现实

人工智能的盛世与泡沫 现今&#xff0c;人工智能热潮席卷科技行业&#xff0c;投资者、创业者和用户都被其光环吸引。然而&#xff0c;深入探讨这种现象&#xff0c;人工智能的泡沫正在形成&#xff0c;乃至具备崩溃的潜质。我们看到的&#xff0c;无非是一场由资本推动的狂欢…

【软件考试】一文学会原码,反码与补码

文章目录 三码互转十进制数转二进制 三码互转 在计算机中&#xff0c;数值通常以二进制形式表示&#xff0c;原码、反码和补码是三种不同的表示方法。 一、原码 概念&#xff1a; 原码是最直观的二进制表示法&#xff0c;最高位为符号位&#xff0c;0 表示正数&#xff0c;1 …

鸿蒙NEXT开发-动画(基于最新api12稳定版)

注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注&#xff0c;博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…

Python笔记之识别到当前python脚本所在的目录,而不是执行python命令的目录

Python笔记之识别到当前python脚本所在的目录&#xff0c;而不是执行python命令的目录 code review! 文章目录 Python笔记之识别到当前python脚本所在的目录&#xff0c;而不是执行python命令的目录1.题解2.在脚本所在的目录后面拼接下一层目录 1.题解 要在Python脚本中识别到…