手写Promise.all/深拷贝/EventEmitter深度解析
Promise.all 克制并发、深拷贝驯服引用、EventEmitter 打通事件通信——三道手写题对应异步控制、数据操作、事件通信三大能力。 边界处理比主流程更能体现功力深浅。
Promise.all 克制并发、深拷贝驯服引用、EventEmitter 打通事件通信——三道手写题对应异步控制、数据操作、事件通信三大能力。 边界处理比主流程更能体现功力深浅。
React 19 三大变革:Compiler 自动记忆化、use() API 打破 Hooks 规则、Server Components 把 React 扩展为全栈框架。 面试考新特性动机与对现有写法的冲击。
React Router 核心是 BrowserRouter 监听 URL 变化(History API 或 hashchange)、Routes 用评分算法匹配路径、RouteContext 与 Outlet 渲染匹配结果。 本质是 URL 与组件映射的声明式实现。
useReducer 用纯函数 reducer 集中管理状态转换,内部与 useState 共享同一 Fiber 更新链路。 事实上 useState 就是预设了 basicStateReducer 的 useReducer 封装。
useMemo 缓存计算结果、useCallback 缓存函数引用,底层都是链表中存 [value, deps] 并用 Object.is 比较依赖。 useCallback(fn, deps) 本质上是 useMemo(() => fn, deps) 的语法糖。
React Diff 是两次判断加三轮遍历:先判单元素还是数组,单元素走 key 到 type 两步,数组走线性扫描、Map 匹配、删除残余。 全程贯穿'能复用绝不重建'的最低 DOM 操作原则。
React 不在每个 DOM 上绑事件,而在根容器统一监听,经 Fiber 树模拟捕获与冒泡路径。 合成事件统一了跨浏览器行为、减少内存占用,并与并发渲染协调。
第一轮按序匹配失败后进入第二轮:剩余旧 Fiber 入 Map,用 lastPlacedIndex 判断复用还是移动,无法复用的旧节点第三轮删除。 这套机制用 O(n) 解决列表乱序更新的最小 DOM 操作问题。
多节点 Diff 第一轮是从左到右的顺序对比快速路径,新旧 key 与 type 都匹配就复用并继续,遇不匹配立即跳出交第二轮 Map 查找。 面试要讲清为何这样设计以提升常见场景性能。
单节点 Diff 先比 key(身份)再比 type(能否复用 DOM),都匹配则复用改属性,任一不匹配则销毁重建,最多一次 DOM 操作。 这是 React Diff 的基础必考题。