Skip to content

大厂前端高频面试题

HTML/CSS

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

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

创建 BFC 的方式

  • overflow 不为 visible
  • displayinline-blocktable-cellflex
  • positionabsolutefixed
  • 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),减少握手延迟