No41.精选前端面试题,享受每天的挑战和学习

简介: No41.精选前端面试题,享受每天的挑战和学习

Set结构和Map结构

Set 结构和 Map 结构是 JavaScript 中的两种特殊数据结构,它们都是 ES6 新增的集合类型,用于存储和操作数据

Set 结构

  • Set 是一种无重复值的集合,其中的每个值都是唯一的。
  • 可以通过构造函数创建 Set,也可以使用 Set 字面量表示法来创建。
  • Set 中的值可以是任意数据类型,包括基本类型和对象引用。
  • Set 内部使用了类似于哈希表的数据结构,所以查找元素的速度非常快。
  • Set 没有提供索引,因此不能通过索引访问其中的元素。
  • Set 有一些常用的方法,如添加元素、删除元素、判断元素是否存在等。

Map 结构

  • Map 是一种键值对集合,可以根据键快速查找到对应的值。
  • 可以通过构造函数创建 Map,也可以使用 Map 字面量表示法来创建。
  • Map 中的键可以是任意数据类型,值也可以是任意数据类型,包括基本类型和对象引用。
  • Map 内部使用了类似于哈希表的数据结构,所以查找键值对的速度非常快。
  • Map 可以通过键来获取或修改对应的值,也可以遍历其中的所有键值对。
  • Map 有一些常用的方法,如添加键值对、删除键值对、判断键是否存在等。

Set 和 Map 的常见用途如下

  • Set 结构可以用来去除数组中的重复元素,或者判断某个元素是否存在于集合中。
  • Map 结构可以用来存储和管理键值对数据,特别适合需要根据键快速查找对应值的场景。

需要注意的是,Set 和 Map 是不同的数据结构,它们的存储和操作方式有所区别,根据使用场景选择合适的数据结构可以提高代码的效率和可读性。

发布订阅模式和观察者模式

发布订阅模式和观察者模式都是常见的设计模式,用于实现【对象之间的解耦】和【消息通信】。

发布订阅模式(Publish-Subscribe Pattern):

  • 发布订阅模式基于事件的概念,包括一个事件中心(或称为消息中心)和多个订阅者。发布者负责发布事件,而订阅者通过订阅感兴趣的事件来接收相应的消息。
  • 发布者和订阅者之间不直接进行通信,而是通过事件中心进行消息的传递。发布者发布事件时,事件中心会将消息广播给所有订阅了该事件的订阅者。
  • 通过发布订阅模式,实现了发布者和订阅者之间的解耦,一个发布者可以有多个订阅者,而订阅者也可以同时订阅多个事件。
  • 常见的应用场景包括事件驱动的系统、UI组件库的事件处理等。

观察者模式(Observer Pattern)

  • 观察者模式定义了一种一对多的依赖关系,当一个对象的状态变化时,其所有依赖者(观察者)都会得到通知并自动更新。
  • 观察者模式主要包含两个角色:主题(Subject)观察者(Observer)。主题维护一组观察者,并在状态变化时通知观察者进行更新。
  • 主题可以有多个观察者,观察者可以根据需要订阅或取消订阅主题的通知。
  • 观察者模式实现了对象之间的松耦合,当一个对象的状态发生改变时,不需要直接调用其他对象的方法,而是通过通知的方式进行更新。
  • 常见的应用场景包括事件监听器、GUI组件的数据绑定等。

发布订阅模式和观察者模式的区别

  • 在发布订阅模式中,发布者和订阅者之间没有直接的关联,它们通过事件中心进行消息的传递;而在观察者模式中,主题和观察者之间是直接关联的。
  • 发布订阅模式允许一个事件有多个订阅者,而观察者模式通常是一个观察者对应一个主题。
  • 在发布订阅模式中,事件中心起到了调度任务的作用,而在观察者模式中,主题只负责通知观察者进行更新。

无论选择使用发布订阅模式还是观察者模式,都可以提高代码的可扩展性和可维护性,使对象之间的通信更加灵活和解耦。

Promise和回调地狱

Promise 和回调地狱是处理异步操作的两种不同方式。

Promise

  • Promise 是 JavaScript 中用于处理异步操作的对象。
  • Promise 通过封装异步操作的结果,可以通过链式调用 then 方法来处理成功的结果,并通过 catch 方法来处理失败的结果。
  • Promise 的特点是可以将异步操作以同步的方式进行编写,使得代码更加可读和易于维护。
  • Promise 可以解决回调地狱的问题,将嵌套的回调函数转换为链式调用的方式,提高了代码的可读性和可理解性。

回调地狱

  • 回调地狱指的是当有多个异步操作需要进行串行执行时,由于每个异步操作的结果依赖于上一个异步操作的结果,导致多层嵌套的回调函数形成一种混乱且难以维护的代码结构。
  • 回调地狱的代码结构不仅难以理解,还容易出现错误和难以调试。
  • 回调地狱的问题可以通过使用 Promise 或者 async/await 来解决,将异步操作转换为顺序执行的方式,避免了多层嵌套的回调函数。

Promise 的使用可以有效地解决回调地狱的问题,使得异步操作更加可控和可读。例如,通过使用 Promise 的链式调用,可以清晰地表达异步操作的顺序,避免了多层嵌套的回调函数,提高了代码的可读性和可维护性。而 async/await 是基于 Promise 的语法糖,进一步简化了异步操作的处理方式。使用 async/await 可以将异步操作写成类似于同步代码的形式,使得代码更加清晰和易于理解。

综上所述,Promise 是一种用于处理异步操作的对象,能够有效地解决回调地狱问题,使得异步代码更加可读和易于维护。

为什么Promise要引入微任务

Promise 引入微任务主要是为了解决异步操作的执行时机和顺序的问题,以确保代码的可靠性和一致性。

传统的 JavaScript 异步操作(如定时器、事件回调等)通常使用宏任务来执行,这些异步操作会被放入宏任务队列中,当主线程执行完当前任务后,从宏任务队列中取出一个宏任务进行执行。

这样的执行机制可能导致以下问题:

  1. 执行顺序不一致:同一个宏任务中的异步操作可能会导致后续代码的执行顺序不一致,造成预期之外的结果。
  2. 阻塞主线程:由于宏任务的执行时机是在主线程空闲时才执行,当宏任务队列中存在大量任务时,会阻塞主线程的执行,影响页面的响应性能。

而引入微任务可以解决上述问题:

  1. 保证顺序一致性:微任务会在当前任务执行完成后立即执行,因此可以确保异步操作的执行顺序与代码编写的顺序一致,避免了不可预测的执行结果。
  2. 避免主线程阻塞:由于微任务是在当前任务执行完成后立即执行,不需要等待主线程空闲,所以微任务的执行不会阻塞主线程,提高了页面的响应性能。

在 Promise 中,通过 then 和 catch 等方法注册的回调函数被称为微任务(microtask),它们会被放入微任务队列中,而不是宏任务队列中。当一个宏任务执行完毕后,会检查微任务队列,如果存在微任务,则依次执行微任务,直到微任务队列为空,再继续下一个宏任务。这样就保证了微任务的执行时机在宏任务之前,从而解决了异步操作顺序和可靠性的问题。

总结来说,引入微任务可以帮助解决异步操作的执行顺序和一致性问题,在 Promise 中使用微任务可以确保异步操作按照预期的顺序执行,并且不会阻塞主线程。

附录:「简历必备」前后端实战项目(推荐:⭐️⭐️⭐️⭐️⭐️)

Vue.js 和 Egg.js 开发企业级健康管理项目

带你从入门到实战全面掌握 uni-app

相关文章
|
12天前
|
Web App开发 前端开发 Linux
「offer来了」浅谈前端面试中开发环境常考知识点
该文章归纳了前端开发环境中常见的面试知识点,特别是围绕Git的使用进行了详细介绍,包括Git的基本概念、常用命令以及在团队协作中的最佳实践,同时还涉及了Chrome调试工具和Linux命令行的基础操作。
「offer来了」浅谈前端面试中开发环境常考知识点
|
2天前
|
XML 前端开发 Java
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
本文阐述了Spring、Spring Boot和Spring MVC的关系与区别,指出Spring是一个轻量级、一站式、模块化的应用程序开发框架,Spring MVC是Spring的一个子框架,专注于Web应用和网络接口开发,而Spring Boot则是对Spring的封装,用于简化Spring应用的开发。
12 0
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
|
2月前
|
存储 XML 移动开发
前端大厂面试真题
前端大厂面试真题
|
1月前
|
网络协议 算法 数据库
|
2月前
|
前端开发 Java 编译器
【前端学java】如何从前端视角快速学习Maven
【8月更文挑战第12天】如何从前端视角快速学习Maven
44 2
【前端学java】如何从前端视角快速学习Maven
|
2月前
|
前端开发 JavaScript API
前端框架Vue------>第二天学习(1)插槽
这篇文章介绍了Vue框架中插槽(slot)的概念和用法,以及如何在组件中使用自定义事件进行父子组件间的通信。
前端框架Vue------>第二天学习(1)插槽
|
2月前
|
前端开发 算法 网络协议
如何学习计算机基础知识,打好前端和网络安全的基础
如何学习计算机基础知识,打好前端和网络安全的基础
39 4
|
2月前
|
存储 前端开发 JavaScript
44 个 React 前端面试问题
【8月更文挑战第18天】
40 2
|
2月前
|
存储 JavaScript 前端开发
2022年前端js面试题
2022年前端js面试题
31 0
|
2月前
|
存储 前端开发 JavaScript
44 个 React 前端面试问题
44 个 React 前端面试问题