以下是根据 React 19 和 Next.js 16 最新技术标准整理而成的一组详细深入的 2026 年前端面试题答案。
一. JavaScript 和 TypeScript 核心
1.事件循环和任务优先级:微任务队列(Promises、async/await、MutationObserver)的优先级高于宏任务队列(setTimeout、I/O、事件)。微任务在同步代码之后立即执行,并且必须在浏览器执行下一个重绘步骤之前完全释放。当递归的 Microtask 线程不断向队列添加新任务时,就会发生“饥饿”,导致 Macrotasks 和渲染无限期地阻塞,从而导致应用程序完全崩溃。
2.内存管理(Mark-and-Sweep & WeakMap):“Mark-and-Sweep”机制从根对象开始,将所有可访问的对象标记为“活动”,并回收未标记对象的内存。 WeakMap 和 WeakSet 持有对象的弱引用,这意味着如果对象没有其他强引用,它们不会阻止垃圾收集器回收内存。这是一个强大的工具,用于存储 DOM 节点或缓存的元数据,而无需担心内存泄漏。
3.对象复制机制:
浅复制:仅复制第一级属性,嵌套对象仍共享相同的引用。
深复制:完全复制对象结构。
比较:
structuralClone()是最快的原生 Web API,支持Map、Set和循环引用,但不能复制函数或 DOM 节点。JSON.parse(JSON.stringify())非常慢并且会丢失特殊数据(Date、RegExp)。lodash.cloneDeep可以处理所有情况,但会增加包大小约 17KB。
4.参考逻辑和复制算法:当赋值b = a时,两个变量都指向相同的内存位置;改变b的属性会直接改变a。为了复制嵌套对象,Lodash 等库使用递归算法与映射相结合来跟踪已处理的对象,有助于避免遇到循环引用时的无限循环并保留复杂的数据类型。
5. Promise.all vs Sequential Await:当任务不依赖彼此并行执行时使用Promise.all,将总等待时间减少到最长任务的时间。 Promise.allSettled 提供稳定性,因为它会等待所有 Promise 完成(无论成功或失败)并返回详细的结果数组,避免像 Promise.all 那样失败的任务导致整个链崩溃。
6.条件性能(Switch 与 If-Else): 当存在多个条件时,switch 通常比 if-else 更快,因为编译器(如 V8)可以创建一个“跳转表”,允许直接访问要执行的指令块 (O(1)),而不是按顺序检查每个分支 (O(n))。
7. TypeScript 演变(Unions 与 Enum): 在 2026 年,“字符串文字联合”('A' | 'B') 组合为 const 是首选,因为它们在编译后完全消失(零包大小),而 Enum 会生成冗余的 JavaScript 代码。此外,数字枚举缺乏类型安全性,因为它们允许分配任何数字值。
8.高级类型(推断和满足): infer 允许从条件类型的复杂结构中提取数据类型(例如,获取函数的返回类型)。 satisfies 运算符有助于检查对象是否与接口匹配,同时保留其文字数据类型,从而帮助 IntelliSense 比使用 as 进行转换更准确。
II。 React 19 核心和钩子
9. useMemo 记住一个函数: 是的,如果该函数是内部计算逻辑块的返回值,则 useMemo 可以完全记住该函数的定义。但是,useCallback 是用于此目的的专用速记语法。
10。 useCallback 用例:除了重新渲染优化之外,在将函数作为依赖项传递给其他钩子(useEffect、useMemo)或防止重新渲染包装在 React.memo 中的子组件时,useCallback 对于确保引用稳定性也很重要。
11.内部 Hook 存储:React 将 hook 值存储为附加到每个 Fiber 节点的 memoizedState 属性的链接列表。 Hook 调用顺序是“神圣的”,因为 React 依赖执行顺序将旧状态正确映射到相应的 Hook;如果你在条件中调用Hook,这个列表就会被索引。
12. useMemo 与 useEffect(相同的逻辑,不同的结果):
useMemo:在渲染过程中同步运行。如果内部存在不纯(副作用)逻辑,它会减慢或冻结 UI 渲染。useEffect:在绘制界面后异步运行。例如:如果逻辑是更新全局变量,
useMemo将在渲染时立即更改该变量,而useEffect将等到用户看到它。新界面发生了变化,导致数据显示时序出现差异。
13. DOM 同步(useEffect 与 useLayoutEffect): useLayoutEffect 在 DOM 更改之后、浏览器绘制之前同步运行。它用于测量元素大小并立即更新 UI 以避免闪烁,而 useEffect(在绘制后运行)将导致用户看到旧 UI 几毫秒。
14.函数组件生命周期:由3个阶段组成:Mount(添加到DOM)、Update(渲染)和Unmount(删除)。 useEffect 在渲染后运行;清理函数在组件卸载之前或在下一次渲染上再次运行效果之前运行,以清理旧资源。
15. Hooks 规则:不要在循环或条件中调用 Hooks,因为 React 根据 Fiber 链表中的调用顺序来管理状态。如果顺序发生变化,React 无法确定哪个状态属于哪个钩子。
16. useRef 机制 (React 19): useRef 返回一个持久对象 {current:...},该对象在整个组件的生命周期中持续存在,而不会在值更改时触发重新渲染。 React 19 允许将 ref 作为常规 prop 传递给子组件,从而无需使用 forwardRef。
17。 Context API 优化:拆分 Context(Context Splitting)来隔离频繁变化的状态,或者将子组件包装在 useMemo/React.memo 中,以避免当父组件 Context 值发生变化但子组件不使用时重新渲染。
18.新的 React 19 Hooks:
-
if/else)。
19。 React 编译器规则:编译器在构建时级别自动记忆。程序员必须遵守 props/state 的纯度(幂等性)和不变性(immutability);如果违反,编译器将“跳过”对该组件的优化。
III。 Next.js 16+ 和渲染策略
20。 Hydration 机制: 服务器发送静态 HTML,其中包含 标记中的初始化数据。在浏览器中,React 读取此数据,重新创建虚拟 DOM,并将事件侦听器“附加”到现有的真实 DOM 节点,而无需重新创建它们。
21.渲染比较(SSG、SSR、ISR、PPR): PPR(部分预渲染)是完美的组合:服务器立即发送“静态 shell”,然后通过 Suspense 并行传输动态组件。这有助于消除传统SSR的“网络瀑布”现象。
22. RSC 到客户端序列化:只有可序列化的数据才能跨服务器-客户端边界传输。函数、类实例或 DOM 节点无法序列化,会导致错误。
23。 Next.js 16 缓存: 使用指令 use cache 来记住组件/函数结果。 revalidateTag() API 用于在后台刷新缓存(stale-while-revalidate),而 updateTag()(仅在 Server Actions 中使用)会立即删除缓存,以实现“read-your-writes”机制。
四.造型、性能和情境
24。 Tailwind v4 Oxide 引擎: Tailwind v4 使用 Rust (Oxide) 编写的引擎,具有“源检测”机制,可自动扫描源文件,仅为实际使用的类生成 CSS,从而帮助构建速度提高 35-50%。
25.关键渲染路径 (CRP) 深入研究: 当遇到 标记(没有 async/defer)时,浏览器会停止解析 HTML 以加载和执行代码。 transform 和 opacity 属性更加高效,因为它们由合成器线程处理,跳过了昂贵的布局和绘制阶段。
26.默认行为和被动监听器:除了 preventDefault() 之外,在事件监听器中使用 passive: true 可以帮助浏览器知道处理程序不会阻止页面滚动,从而提高 UI 平滑度。
27.存储比较:
SameSite。28。 XSS/CSRF 保护:LocalStorage 容易受到 XSS 攻击,因为 JavaScript 可以访问它。 Cookie 使用 HttpOnly 防止 XSS,使用 Secure 强制执行 HTTPS,并使用 SameSite=Strict/Lax 阻止 CSRF 攻击。
29.刷新令牌轮换(Next.js 16 Proxy):使用proxy.ts文件(替换传统中间件)拦截请求。如果访问令牌过期,代理将调用刷新令牌 API,更新新的 HttpOnly cookie 并允许请求继续使用新信息。
30.集中式策略引擎 (RBAC):使用集中式引擎(如 Oso)在单独的文件中定义权限规则。此逻辑统一应用于服务器组件(用于呈现 UI)和服务器操作(用于安全执行),防止用户编辑客户端代码以欺骗权限。
31. 10,000个输入表单设计:用户onBlur后立即将每个字段存储(字段级保存)到服务器。使用Redis根据浏览器Fingerprint或Session Cookie保存草稿,让用户无需登录或使用客户端存储即可返回继续输入。
32. 3 Tab Lag 解决方案 (React 19): 使用 useTransition 将选项卡转换标记为非抢占式更新,保持 UI 响应能力。应用 组件 (React 19.2) 隐藏旧选项卡而不丢失状态/DOM,有助于在您返回时立即重新显示它。
33.分页竞争条件:使用AbortController。用户切换到新页面后,立即调用 controller.abort() 取消正在运行的旧页面的请求,确保最后显示的数据始终与最新页面匹配。
另请参阅:高级 Next.js 2026 面试问题
分享








