面试技术问题汇总

90 阅读9分钟

1、会 node?ts?vue3?React?

2、为什么 http2.0 没有 TCP 限制

http2.0 的报文头和主体都可以使用二进制,并统称为帧,基于这个我们可以把请求的报文拆分成数据包,每个数据包里面携带对应的请求信息,这样服务端和客户端可以同时发送多个请求或回应。

理论上是无限制的,但是实际上浏览器在实现的时候,控制了请求并发数。

3、如果并发数比较多的话,怎么优化性能

归纳:减少 http 请求

图片:精灵图、图片压缩、base64

文件:文件合并、代码压缩

过滤请求:请求节流、缓存请求(实时修改但不是立马给服务端)

4、强缓存和协商缓存,打包后的值怎么和缓存配合(重点)

5、长列表优化

  • 懒加载:IntersectionObserver(交叉观察器)(监听 scroll + 节流 可能会有性能问题)
  • 触底加载
  • 虚拟列表:将页面按照可视区域内容大小进行切片,只展示可视区的内容,非可见区域不渲染,在滚动时,实时更新可见区域内容

6、cookie 和 storage

7、cookie 和 session

8、内存泄漏的问题

意外的全局变量

定时器里面引用了外部变量

DOM 被删除了,但是没有清除对 DOM 的引用

清楚延时器/避免意外的全局变量/使用 weakMap、weakSet

9、浏览器一个 tab 的内存上限

较新的 chrome 版本,单 tab 内存上限是 1.8G。正常情况下程序使用的内存是不会超出这个限制的,但是如果存在内存泄漏,可能会在较长的时间之后超出内存限制。

10、下拉框里面的数据过多,全选的话数据超过请求的体积限制,怎么做

和服务端协商,修改数据传参

11、实现一个自适应输入框,根据用于输入的值自动设置宽度

监听 input 事件,获取输入值的宽度并设置,怎么获取输入值,最开始说获取内容的数量,但这个是不精确的,后面说外面包一层 div,获取 input 的实时宽度,设置 div 的样式(输入框样式)

外面包一层透明的 span(宽高由内容决定),input 设置为宽高 100%自适应

12、有哪些图片格式

webp 也支持动图和透明,文件体积小,支持有损和无损压缩

jpg 有损压缩 png 无损压缩 GIF 无损压缩

13、懒加载的 lazy

<img src="https://i.postimg.cc/GtN3Cs02/1.jpg" loading="lazy" />

懒加载有以下几种方式

  • 设置 img 的 loading 标签值为 lazy,需要知道图片的宽高
  • interSectionObserver API webAPI,低版本需要 polyfill
  • vue 的官方懒加载插件 lazyLoad,github 现存 issues 较多

14、webpack5 新技术

更快的构建速度、更小的代码体积

  • 持久性的缓存,通过文件内容生成 hash 作为文件名(通过 cache 配置)
  • 模块联邦,适用于微前端,解决不同子应用之间代码共享的问题
  • 改进的 Tree Shaking
  • 入口文件的顶层使用异步加载
  • 内置压缩功能
  • 更好的代码分割

15、怎么不打包部分代码

externals

16、useMemo 和 useCallback

相同点:缓存

区别:mome 对应变量 callback 对应函数

主要区别是 React.useMemo 将调用 fn 函数并返回其结果,而 React.useCallback 将返回 fn 函数而不调用它。

如果 useCallback 中使用大型 State 会有什么问题

React 函数式组件还是类组件

函数式组件实现一个定时器,拿不到 count,使用 useEffect

17、hppts 的加密方式是怎么加密的

对称加密 + 数字签名

信息加密 + 完整性校验(数据 hash 值传输验证)+ 身份验证(非对称加密)

18、对称加密和非对称加密有哪些以及区别

非对称加密:RSA

对称加密:ASE

19、http2.0 和 http1.0 区别

20、http3.0 了解吗

21、Vue父子组件之间的通信

22、Vue 的响应式原理的实现

23、虚拟 DOM 了解吗

24、你知道微前端吗 用过吗 公司有需求吗

项目里有 iframe 嵌入吗,简单说一下嵌入的实现

25、vuex 的几个核心

26、ref 和 DOM API 的区别

如果 ref 用在组件上,$refs 可以得到组件的实例对象

27、常见的路由守卫

全局守卫:beforeEach、beforeResolve、afterEach

路由守卫:beforeEnter

组件内守卫:beforeRouteEnter、beforeRouteUpdate、beforeRouteLeave

28、rem 和 em 区别

29、less 具体优点

less 编程式语言,使用变量、函数、嵌套,sass 的功能比 less 会更多一点

30、用过混入吗

31、父子页面生命周期加载顺序

32、怎么实现深拷贝,function 可以 JSON.stringify 吗

JSON.parse(JSON.stringify(obj))

无法处理的值:undefined、function、Symbol、包含循环应用的对象

33、es6 的新特性

新变量:Symbol、BigInt、Map、Set、模板字符串、class 类

变量声明使用:let const、可选链、解构、扩展运算符

方法:箭头函数、数组对象新增方法

请求处理:promise

变量声明:声明一个变量

变量定义:赋值

34、箭头函数可以用 call 吗

35、你了解的 this 指向

默认 window

作为对象方法调用,指向.

创建 new 实例的时候,指向实例对象

显示通过 call、apply、bind 绑定

36、对同步和异步的理解

同步:自上而下的执行任务,如果当前任务需要一段时间才能返回结果,会一直等待任务结果,结果返回之后再继续向下执行。

异步:自上而下的执行任务,如果当前任务需要一段时间处理,跳过这个任务,把这个任务存起来,继续向下执行,执行完所有的任务之后,再来看之前存起来的任务是不是执行好了,执行完毕后去处理。

37、安全方面的问题由关注过 用过吗

XSS 跨站脚本攻击

  • 输入过滤(来自 url 的参数、input 输入的值过滤,已经通过加密套件处理好了) 输出编码(输出到页面上的数据,可以对<>进行编码)
  • CSP:限制网页加载资源

CSRF 跨站请求伪造攻击

  • origin、refer
  • SameSite:Lax(导航到目标网站的 GET 请求可以携带 a link get 提交表单)

DNS 攻击

中间人劫持

38、DNS 劫持知道吗?怎么预防

本地劫持、路由器劫持、域名服务器劫持、拦截浏览器和域名服务器的通信(明文)

预防

  • 不要点击可疑或者不熟悉的链接
  • 使用信誉良好的反病毒软件
  • 使用 VPN 构建加密通道
  • 更改路由器的密码(强密码)
  • 限制 DNS 访问
  • 客户端锁定

www.kaspersky.com.cn/resource-ce…

39、数组去重的方式,多个对象按照 id 去重

双重循环,id 相等

一次循环,some/find 方法

reduce(初始值, 当前元素值, 当前元素下标, 被遍历的数组)

40、简单说一下 webpack 的配置项(mode)

开发 mode:速度快,体积大

生产 mode:构建速度慢,体积小

mode、入口、出口、loader、plugin、devServer

41、怎样通过 webpack 提升页面性能

打包体积(删除无用代码、压缩)、分包、打包后的命名和缓存结合

42、怎样通过 webpack 提升加载速度

升级 webpack5

webpack5 的 cache

多进程、dll、缩小文件搜索范围

43、具体 webpack 缓存是怎么做的

loader 缓存:cacheDirectory 或者 loader 抛出的其他属性

webpack4 有一个缓存插件,将内容缓存到内存中

webpack5 新增持久化缓存功能,直接配置 cache,文件内容 hash 表示

44、常用的 Git 指令

  • 配置指令 Git config
  • 初始化、连接远程仓库 Git init、Git remote
  • 提交代码 Git add commit push pull reset merge rebase
  • 分支 Git checkout branch
  • 跟踪 Git log status

45、更新代码冲突怎么办(Git pull)

编辑器查看冲突部分(可视化)

找到提交冲突代码的人

协商看看如何处理冲突

处理完成之后继续提交

46、tree-shaking 的理解

47、被打包后的文件是 es 还是 commonjs

commonjs,发生在代码转义阶段(?)

48、keep-alive 的理解

通过缓存数组存储组件的 vnode(描述虚拟组件的节点) 设置了 keep-alive 缓存的组件,会多出两个生命周期钩子(activateddeactivated):

  • 首次进入组件时:beforeRouteEnter > beforeCreate > createdmounted > activated > ... ... > beforeRouteLeave > deactivated

  • 再次进入组件时:beforeRouteEnter >activated > ... ... > beforeRouteLeave > deactivated

49、继承,怎么继承静态属性

es5 中的静态属性、静态方法是无法通过继承直接传递下来,需要手动赋值

es6 可以继承下来

静态方法是没有 this 的,因为 this 指向实例,而静态方法属于类

50、svg 的优势,怎么管理 svg

优势:矢量图、缩放不影响清晰度、文件较小、可编程性

svg 可透明、也可以设置动图

只有 svg 图片可以生成字体图标

类似于精灵图

51、怎么使用 webp 的

可以使用 picture

项目中判断是否支持 webp,挂载在外部的标签上,less 函数判断父类是否包含

特殊处理(CDN 的图片处理能力)

52、什么会阻塞页面渲染

CSS 解析:CSS 文件太大或者选择器效率低,CSS 解析变慢,阻塞页面渲染

JS 阻塞:JS 线程和 GUI 渲染线程互斥

浏览器的渲染帧率达不到 60,比较卡顿

回流重排的次数太多(性能消耗,不停的进行布局)

53、for 循环跳出

break 跳出当前循环、continue 跳出当次循环、return 跳出函数

例外:forEach 的 return 只会跳出当次循环,且不能使用 break 和 continue

可以通过 try catch 抛出错误跳出循环,或者设置 index 为最后一个下标

54、Map 和 weakMap

Map 键可以使用任何类型、weakmap 的键只能是对象

WeakMap 中的键不参与垃圾回收,引用消失,键值对自动消失

WeakMap 内部没有实现迭代器

55、看过 Map 源码吗 知道底层序列化吗

56、用过 vite 吗 vite 和 webpack 区别

vite 的开发环境启动速度和模块热更新速度都很快,但是 webpack 的插件生态更丰富

vite 不会将代码打包,利用浏览器原生支持 esm 的方式,实现按需加载,webpack 需要加载成 commonjs,速度较慢,即使 webpack 也有热更新,但是效率也比不上 vite

57、如果有 100 个 esm 为什么会阻塞页面渲染(?)

阻塞、并发

58、监控路由加载性能的时候,需要在 mounted 中写代码,怎么无侵入式的写呢(hooks、切片?)

59、vue 依赖太多,怎么解决卸载时的性能问题(vue2 和 vue3)