虚拟 DOM 是用普通 JavaScript 对象描述的 UI 结构(类型、props、children),是真实 DOM 的轻量映射。状态变化时,框架先用新状态生成新的虚拟 DOM 树,与旧树 diff 出最小差异,再把差异批量 patch 到真实 DOM,避免直接操作 DOM 的高成本和手动维护的复杂性。它同时带来跨平台能力(同一套 VDOM 可渲染到 Native、Canvas 等)。

diff 算法思路:真实 DOM 树的 diff 是 O(n³),React 做了三个假设将其降到 O(n):不同类型元素直接销毁重建;同层比较、不跨层移动;通过 key 标识同层节点身份。具体过程:同层遍历新旧 children,相同 key 且类型相同的节点复用并递归更新,多余的删除,缺失的新增,顺序变化则移动。React 18 之后 diff 被整合进 Fiber 的 reconcile 阶段,可中断、可调度。

易错点:虚拟 DOM 不一定比直接操作 DOM 快,它的价值是"足够快 + 声明式 + 批量更新"。追问方向:Fiber 架构、为什么 Vue3 的编译时优化能减少运行时 diff、diff 中 key 的作用。