Skip to content

大厂前端高频面试题 ​

HTML/CSS ​

1. 什么是 BFC?如何创建 BFC? ​

BFC(Block Formatting Context,块级格式化上下文)是 Web 页面的可视 CSS 渲染的一部分,是块盒子的布局过程发生的区域,也是浮动元素与其他元素交互的区域。

创建 BFC 的方式:

  • overflow 不为 visible
  • display 为 inline-block、table-cell、flex 等
  • position 为 absolute 或 fixed
  • float 不为 none

2. Flex 布局的常见属性有哪些? ​

容器属性:

  • flex-direction:主轴方向
  • justify-content:主轴对齐方式
  • align-items:交叉轴对齐方式
  • flex-wrap:是否换行
  • align-content:多行对齐方式

项目属性:

  • flex-grow:放大比例
  • flex-shrink:缩小比例
  • flex-basis:基础大小
  • align-self:单独对齐方式

3. CSS 选择器优先级 ​

!important > 行内样式 > ID 选择器 > 类/伪类/属性选择器 > 标签/伪元素选择器 > 通配符

JavaScript ​

1. 简述事件循环(Event Loop) ​

JavaScript 是单线程语言,通过事件循环实现异步操作。事件循环的执行顺序:

  1. 执行同步代码(宏任务)
  2. 执行所有微任务(Promise、MutationObserver 等)
  3. 执行下一个宏任务(setTimeout、setInterval 等)
  4. 重复步骤 2-3

2. 什么是闭包?有什么作用? ​

闭包是指有权访问另一个函数作用域中的变量的函数。创建闭包的常见方式,就是在一个函数内部创建另一个函数。

作用:

  • 数据封装和私有化
  • 实现模块化
  • 保存函数执行状态

3. 深拷贝和浅拷贝的区别? ​

  • 浅拷贝:只复制对象的第一层属性,嵌套对象仍然共享引用
  • 深拷贝:递归复制所有层级,完全独立的新对象

实现深拷贝的方法:

  • JSON.parse(JSON.stringify(obj))(有局限性)
  • 递归实现
  • structuredClone()(现代浏览器支持)
  • lodash.cloneDeep()

Vue ​

1. Vue 的响应式原理 ​

Vue2:通过 Object.defineProperty() 劫持对象属性的 getter 和 setter,在数据变化时通知依赖更新。

Vue3:使用 Proxy 代理整个对象,可以监听更多操作(新增属性、删除属性等),性能更好。

2. Vue 的 Diff 算法 ​

Vue 采用双端 Diff 算法,对比新旧虚拟 DOM 树:

  1. 对比新旧节点列表的头部和尾部
  2. 通过 key 值寻找可复用的节点
  3. 处理剩余节点(新增或删除)

时间复杂度为 O(n),相比 React 的 O(n³) 更高效。

3. Vue 组件通信方式 ​

  • Props / $emit
  • $parent / $children
  • $refs
  • Provide / Inject
  • EventBus / mitt
  • Vuex / Pinia
  • $attrs / $listeners

React ​

1. React 生命周期 ​

类组件:

  • 挂载:constructor → getDerivedStateFromProps → render → componentDidMount
  • 更新:getDerivedStateFromProps → shouldComponentUpdate → render → getSnapshotBeforeUpdate → componentDidUpdate
  • 卸载:componentWillUnmount

函数组件(Hooks):

  • useEffect 模拟生命周期
  • useLayoutEffect 同步执行副作用

2. React Fiber 架构 ​

Fiber 是 React 16 引入的新协调算法,主要解决:

  • 可中断的渲染(Time Slicing)
  • 优先级调度
  • 更好的错误处理

3. React Hooks 使用规则 ​

  1. 只在最顶层使用 Hooks,不要在循环、条件或嵌套函数中调用
  2. 只在 React 函数中调用 Hooks
  3. 自定义 Hook 必须以 "use" 开头

浏览器 ​

1. 从输入 URL 到页面渲染发生了什么? ​

  1. DNS 解析
  2. TCP 连接(三次握手)
  3. 发送 HTTP 请求
  4. 服务器处理请求并返回响应
  5. 浏览器解析 HTML 构建 DOM 树
  6. 解析 CSS 构建 CSSOM 树
  7. 合并 DOM 和 CSSOM 构建渲染树
  8. 布局(Layout/Reflow)
  9. 绘制(Paint)
  10. 合成(Composite)

2. 浏览器的缓存策略 ​

  • 强缓存:Expires、Cache-Control
  • 协商缓存:Last-Modified / If-Modified-Since、ETag / If-None-Match

3. 跨域解决方案 ​

  • CORS(跨域资源共享)
  • JSONP(只支持 GET)
  • 反向代理(Nginx、Webpack devServer)
  • postMessage
  • WebSocket

网络 ​

1. HTTP 和 HTTPS 的区别 ​

  • HTTP 明文传输,HTTPS 加密传输(SSL/TLS)
  • HTTPS 需要证书
  • HTTPS 默认端口 443,HTTP 默认端口 80

2. TCP 三次握手和四次挥手 ​

三次握手:

  1. 客户端发送 SYN
  2. 服务端回复 SYN + ACK
  3. 客户端回复 ACK

四次挥手:

  1. 客户端发送 FIN
  2. 服务端回复 ACK
  3. 服务端发送 FIN
  4. 客户端回复 ACK

3. HTTP 各版本的区别 ​

  • HTTP/1.0:短连接,每次请求都新建 TCP 连接
  • HTTP/1.1:持久连接、管道化、分块传输
  • HTTP/2:二进制分帧、多路复用、头部压缩、服务器推送
  • HTTP/3:基于 QUIC(UDP),减少握手延迟