2023看了答案都记不住的前端面试题...

290 阅读7分钟
1.封装FetchAPI,要求超时报错的同时,取消执行promise,而不是继续执行

答案:blog.csdn.net/qq_37299525…

2.实现继承的6种方式以及优缺点详解

我感觉说出来这6种再理解下原型链和构造函数的继承就够了,没必要一定记住优缺点,要是面试官真的接着问,那就是搞咱!意义不大了就。
原型链构造函数组合继承原型式寄生式寄生组合式

- 原型链

特点
实例的构造函数的属性,父类构造函数属性,父类原型的属性。(新实例不会继承父类实例的属性!)
缺点
1、新实例无法向父类构造函数传参。
2、继承单一。
3、所有新实例都会共享父类实例的属性。

- 构造函数继承:

特点
1、只继承了父类构造函数的属性,没有继承父类原型的属性。 2、解决了原型链继承缺点1、2、3。 3、可以继承多个构造函数属性(call多个)。 4、在子实例中可向父实例传参。
缺点
1、只能继承父类构造函数的属性。 2、无法实现构造函数的复用。(每次用每次都要重新调用) 3、每个新实例都有父类构造函数的副本,臃肿。

3.强缓存和协商缓存的区别

强制缓存的思想是,在浏览器内置数据库中缓存每次请求中 “可以被缓存”文件,主要取决于两个字段 Expires 和 Cache-Control 中的 max-age 字段。 协商缓存主要由 ETag 和 Last-Modified 两个字段来实现,Last-Modified 这个字段可以记录的时间戳精确度是有一定限制的,如果连续多次数据更新在精确度范围外, 会产生精确度丢失, 因此通常会让ETag 的优先级高于 Last-Modified 字段

4.QUIC 是基于TCP 的吗?

QUIC 协议是 Google 提出的一套基于 UDP 的开源协议,它汇集了 TCP和 UDP 的优点,传输高效并且可靠,解决了TCP目前遇到的困境。

5.HTTP1.0,2.0,3.0 的区别

HTTP 1.0

  • 无状态,无连接
  • 短连接:每次发送请求都要重新建立tcp请求,即三次握手,非常浪费性能
  • 无host头域,也就是http请求头里的host
  • 不允许断点续传,而且不能只传输对象的一部分,要求传输整个对象

HTTP 1.1

  • 长连接,流水线,使用connection:keep-alive使用长连接
  • 请求管道化
  • 增加缓存处理(新的字段如cache-control)
  • 增加Host字段,支持断点传输等
  • 由于长连接会给服务器造成压力

HTTP 2.0

  • 二进制分帧
  • 头部压缩,双方各自维护一个header的索引表,使得不需要直接发送值,通过发送key缩减头部大小
  • 多路复用(或连接共享),使用多个stream,每个stream又分帧传输,使得一个tcp连接能够处理多个http请求
  • 服务器推送(Sever push)

HTTP 3.0

  • 基于google的QUIC协议,而quic协议是使用udp实现的
  • 减少了tcp三次握手时间,以及tls握手时间
  • 解决了http 2.0中前一个stream丢包导致后一个stream被阻塞的问题
  • 优化了重传策略,重传包和原包的编号不同,降低后续重传计算的消耗
  • 连接迁移,不再用tcp四元组确定一个连接,而是用一个64位随机数来确定这个连接
  • 更合适的流量控制
6.Eventsouce和长轮询的差别? webSocket 是怎么保持的长连接

Eventsouce是服务器->客户端;长轮询是客户端->服务器端。 Eventsouce其实是单向通信,而websocket是双向通信。 websocket保持的长连接是因为:Tcp长连接 + ⼼跳包。

7.requestAnimationFrame 是否会被阻塞,rAF阶段是在 dom 渲染前还是渲染后?

不会阻塞,rAF是渲染之前发生,而rIC是渲染后发生,

8.postMessage 和 worker了解吗?

postMessage应用于主页面和iframe之间进行数据的传递 postMessage应用于js主线程和worker多线程之间进行数据传递,
Web Worker 的作用,就是为 JavaScript 创造多线程环境,允许主线程创建 Worker 线程,将一些任务分配给后者运行。

9.说下virtual dom在vue和react的区别?diff算法有什么不同?为什么vue叫渐进式的?

virtual dom
React和vue的虚拟dom都是一样的, 都是用JS对象来模拟真实DOM,然后用虚拟DOM的diff来最小化更新真实DOM。
diff
vue对比节点,如果节点元素类型相同,但是className不同,认为是不同类型的元素,会进行删除重建,但是react则会认为是同类型的节点,只会修改节点属性。 vue的列表比对采用的是首尾指针法,而react采用的是从左到右依次比对的方式,当一个集合只是把最后一个节点移动到了第一个,react会把前面的节点依次移动,而vue只会把最后一个节点移动到最后一个,从这点上来说vue的对比方式更加高效。
Vue是一套用于构建用户界面的渐进式框架
Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。

10.runtime和manifest分别是什么

runtime: 在浏览器运行过程中,用来链接模块化应用程序所需的代码,他包含在模块交互时,链接模块所需的加载和解析逻辑。
manifest: 当compiler开始执行、解析和映射应用程序时,它会保留模块所有的详细要点。

11.用 TS 怎么装饰器?能不能讲下原编程?

谢谢这个面试官,根本不会,放个链接,自己理解吧:blog.51cto.com/u_11887782/…

12.遍历数组 /对象、for in 遍历对象时会不会访问原型

for of/for in
使用 for in 循环遍历对象的属性时,原型链上的所有属性都将被访问

13.rem原理

rem是响应式布局的一种,是相对于根元素(即html元素)font-size计算值的倍数的一个css单位。因为rem的特性相对长度单位,常被用来做移动适配。

14.事件循环机制:

js是单线程
同步和异步
异步又分为:宏任务和微任务,微任务在任务队列中。

宏任务
  • setInterval()
  • setTimeout()
  • setImmediate()
  • ajax
  • 事件绑定
微任务
  • new Promise()后的then与catch函数
  • new MutaionObserver()
  • process.nextTick(Nodejs)
15.XSS与CSRF有什么区别:

XSS:恶意脚本通过服务器回显到用户浏览器中执行;

CSRF:可能是恶意脚本或HTML标签,可以不经过服务器的回显,使得浏览器发起了攻击性的请求;

XSS更像漏洞,CSRF更像攻击;

16.Less和Sass:

变量、mixin、继承、嵌套

Less是基于JavaScript,是在客户端处理的。
Sass是基于Ruby的,是在服务器端处理的。

关于变量在Less和Sass中的唯一区别就是Less用@,Sass用$

17.现在有个父子组件,我希望在父级中给子组件绑定一个原生click事件,这个事件会被触发吗?

不能,绑定的该click事件会被当做组件 一个普通属性看待,如果想要使click事件生效,可以使用 aclick.native=" change" 的方式来实现

18.this.semit 的返回值是什么?如果需要返回值该怎么办?

this.$emit 的返回值就是this,即当前子组件VueComponent。

image.png

19.冒泡排序、快速排序、数组排序
冒泡排序

1、比较相邻的两个元素,如果前一个比后一个大,则交换位置。
2、比较完第一轮的时候,最后一个元素是最大的元素。
3、这时候最后一个元素是最大的,所以最后一个元素就不需要参与比较大小。

快速排序

实现思路是,将一个数组的排序问题看成是两个小数组的排序问题,以一个数为基准(中间的数),比基准小的放到左边,比基准大的放到右边,而每个小的数组又可以继续看成更小的两个数组,一直递归下去,直到数组长度大小最大为2。

数组排序

sort/map/indexof

20.vue路由监听方式:

1:通过 watch 进行监听
2:通过钩子函数 beforeRouteEnter、beforeRouteUpdate、beforeRouteLeave进行监听
3:全局路由监听 this.$router.beforeEach