跳到主要内容

对虚拟DOM的理解

面试速答

  • 以下内容以 React 18 为准。
  • 虚拟 DOM 本质上不是浏览器里的 DOM,而是 React 用 JavaScript 对象描述出来的 UI 树
  • React 更新时先得到新的虚拟 DOM,再和旧树做比较,最后把真正需要变更的部分提交到真实 DOM。
  • 它的价值不只是“快”,更重要的是:让 UI 更新可编程、可跨平台、可调度

核心理解

可以把虚拟 DOM 理解成 React 内部的一层“中间表示”:

  • JSX 不是直接操作 DOM,而是先变成元素对象
  • React 根据这些对象构建 Fiber 树
  • Fiber 完成计算后,React 再把结果提交到浏览器 DOM

所以 React 的工作可以拆成两段:

  1. 先在内存里算出“页面应该长什么样”
  2. 再把差异同步到真实 DOM

这比“每次状态一变就立刻手写 DOM 操作”更容易管理复杂界面。

它解决了什么问题

1. 让声明式 UI 成立

开发者只描述“状态对应什么界面”,不用手动写:

  • 什么时候创建节点
  • 什么时候删除节点
  • 什么时候改属性

2. 让更新可以批处理和调度

React 18 里更新不是一触发就立刻直冲 DOM,而是先进入调度系统,再按优先级处理。

没有虚拟 DOM/Fiber 这层中间模型,这种能力很难统一实现。

3. 让 React 可以不只渲染浏览器

因为 React 操作的首先不是 DOM,而是“元素描述”,所以它可以对接:

  • React DOM
  • React Native
  • 自定义渲染器

面试里要说清的边界

1. 虚拟 DOM 不等于 Fiber

  • 虚拟 DOM 更偏“UI 描述结果”
  • Fiber 更偏“React 内部执行和调度的数据结构”

面试里把两者混成一个概念,通常会被继续追问。

2. 虚拟 DOM 也不是零成本

它会带来:

  • 创建对象的成本
  • Diff 的成本
  • 调度和遍历的成本

所以不能简单说“有虚拟 DOM 就一定最快”。

3. key 很重要

列表更新时,React 依赖 key 判断节点是否可复用。key 不稳定会导致:

  • 多余移动
  • 状态错位
  • 输入框内容串位

典型题标准答法

问:虚拟 DOM 的本质是什么?

答:本质是用 JavaScript 对象描述 UI。React 先在内存里计算新旧 UI 差异,再把需要变更的部分同步到真实 DOM。

问:它的核心价值是什么?

答:不是单点性能神话,而是给 React 提供了声明式编程、差异更新、跨平台渲染和调度优化的基础。

易错点

  • 把虚拟 DOM 说成“直接复制一份真实 DOM”。
  • 把“虚拟 DOM 快”当成唯一结论。
  • 说不清 key、Diff、Fiber 之间的关系。

速记要点

  • 虚拟 DOM = UI 的对象描述,不是真实 DOM。
  • React 先算结果,再提交差异。
  • 它的意义是可维护性、可调度性、跨平台,不只是性能。