IndexedDB 事务的原子性如何保证?
本文解释 IndexedDB 事务原子性的机制、触发回滚的条件和工程边界。明确任一操作失败默认回滚所有变更,但错误处理可阻止回滚,版本变更和崩溃场景需单独考虑。
程序员面试题库第 22 页,收录第 1051–1100 题,共 5000 道完整解析,覆盖前端、JavaScript、React、Vue、Node.js、AI Agent、网络、数据库与系统设计。
按稳定语义路径排序
本文解释 IndexedDB 事务原子性的机制、触发回滚的条件和工程边界。明确任一操作失败默认回滚所有变更,但错误处理可阻止回滚,版本变更和崩溃场景需单独考虑。
围绕“IndexedDB 中 readwrite 和 versionchange 事务的作用域有什么不同”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须指出 versionchange 不受其他连接影响,readwrite 只在部分对象存储上。
围绕“IndexedDB 版本变更流程中 onupgradeneeded 的作用是什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答要聚焦于如何定义对象存储结构和迁移。
围绕“localStorage 存储中 JSON 序列化和深层嵌套有什么问题”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须讨论性能与数据大小边界,以及备用方案。
围绕“在浏览器隐身模式下 localStorage 可能遇到什么限制”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须讨论写入可能被拒绝或配额为 0。
围绕“localStorage 的 setItem、getItem 和 removeItem 与直接属性赋值有什么差别”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明同名属性和保留字的问题。
围绕“为什么收到 storage 事件后获取 localStorage 可能不是最新值”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要解释事件异步引起竞争。
围绕“为什么 localStorage 的同步读写会阻塞主线程”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要解释同进程访问磁盘/数据库导致 JS 线程等待。
围绕“如何向浏览器申请永久性存储(persistent storage)”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 persist() 的调用和用户授权与自动授予条件。
围绕“如何检测浏览器当前可用存储空间和已用配额”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕用 Storage API 的 estimate() 返回 usage 和 quota。
围绕“当浏览器存储配额超限时,IndexedDB 会抛出什么错误”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须指出错误类型和监听 onabort/onerror。
本文解释sessionStorage生命周期与标签页的关系:刷新保留数据,关闭标签页清除;新标签页默认独立,window.open或复制标签页可继承初始快照。区分复制、新开、刷新三种操作对sessionStorage的具体影响并给出工程判断。
围绕“Storage Buckets API 能解决哪些存储配额管理问题”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明创建多个桶并为每个设置配额。
本题解释 storage 事件不触发原因:其设定是通知其他同源文档,改动页面自身不接收;同时说明 localStorage 和 sessionStorage 的事件范围差异,以及实现跨页同步时的注意事项。
围绕“浏览器对第三方 iframe 的 localStorage 和 Cookie 如何分区”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答访问可能被阻止或返回空,不深入特定浏览器策略。
围绕“当 localStorage 被清除时,storage 事件的 key 属性是什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须明确整个 clear() 会触发 key 为 null 的事件。
围绕“使用 SharedArrayBuffer 进行多线程编程时,Atomics 对象提供哪些操作来避免竞态”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕列举原子操作如 add, compareExchange, wait 等,不深入实现。
本题解释 DedicatedWorkerGlobalScope 与 window 的关键差异:self 指向该作用域而非 window,postMessage 专门向父线程通信,close 终止 Worker。同时提及 DOM 缺失、requestAnimationFrame 可用等边界。
围绕“为什么使用 SharedArrayBuffer 需要启用跨源隔离(cross-origin isolation)”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖解释安全原因,以及必须用 COOP 和 COEP 响应头。
本题解释 Web Worker 不阻塞主线程的原因:独立线程与事件循环、结构化克隆消息通信,结合场景与边界说明其实践条件与限制。
围绕“Service(服务)Worker 的生命周期包括哪几个阶段?各阶段对应哪些事件”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕重点在 install/activate/fetch 等事件。
围绕“Service(服务)Worker 如何与打开的页面进行双向通信”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕通过 postMessage 与 Client 交互。
围绕“Service(服务)Worker 的 fetch 事件如何拦截并处理页面发出的网络请求”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖解释 respondWith 的方法与缓存策略的基础,不深入到 Cache API。
围绕“当 Service(服务)Worker 的脚本文件更新时,浏览器如何决定是否启用新版本”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要比较脚本内容变化与 skipWaiting。
围绕“SharedArrayBuffer 在 Worker 之间共享内存时,它的内存可见性如何保证”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明需要 Atomics 进行同步,且需要跨源隔离上下文。
围绕“共享 Worker 如何向它所有的连接端口广播消息”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕遍历 ports 或用 MessageChannel 的替代。
共享 Worker 的核心是重复使用同一线程,多个客户端用独立的 MessagePort 相连。本文讲解连接流程、端口激活和 worker 生命周期,并指出常见坑。
围绕“用 SharedWorker 时,客户端通过 port 的 postMessage 与 onmessage 通信,需”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕必须调用 port.start() 或设置 onmessage。
本题解释 Transferable 对象(如 ArrayBuffer)在 Worker postMessage 中的零拷贝传递原理:共享所有权转移而非复制,原上下文对象被分离;对比结构化克隆,突出性能与安全优势,并给出使用边界和一些可转移对象类型。
讲解浏览器中专用 Worker、共享 Worker、Service Worker 三类线程的职责、生命周期差异,给出选型条件、常见误用边界与判断方法。
围绕“BroadcastChannel 和 SharedWorker 在跨标签页通信上有什么不同”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕广播频道与共享 worker 的数据缓存和生命周期对比。
围绕“两个消息在 Worker 和主线程之间发送时,它们的到达顺序能保证吗”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖消息按发送顺序传递,但注意不同通道(如 port1 和 port2)的顺序。
围绕“在 Worker 中使用 console.log 的输出会显示在浏览器开发者工具哪里”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕在 DevTools worker 上下文中查看。
围绕“postMessage 传递不可克隆的对象(如函数、DOM 节点)时会怎样”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕触发异常及检查,不涵盖 HTML 规范。
围绕“在一个 Worker 中的全局变量能否在多个消息任务之间共享”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕强调 Worker 每次消息处理之间变量会保留。
围绕“Worker 之间互相等待消息时可能出现死锁吗?如何避免”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕事件驱动通常无锁,但需要避免无限等待。
围绕“如何检测浏览器是否支持某个 Worker 特性(如 SharedWorker 或 SharedArrayBuffer”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕通过 typeof 或 条件判断。
围绕“Worker 内部抛出的异常如何传递到主线程并被捕获”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕事件 error 与 messageerror 的区别。
围绕“在 Worker 中抛出的 Promise 拒绝会不会触发全局错误事件”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕未处理的 Promise 在 worker 中也触发 unhandledrejection。
围绕“Worker 里的事件循环和主线程的事件循环是完全独立的吗”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕每个独立全局都有独立事件循环,说明不会相互阻塞。
围绕“在 Worker 中通过 importScripts() 加载多个脚本时,执行的顺序和错误处理是怎样的”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕同步加载,顺序执行,错误中断。
围绕“在一个 Worker 内部还能再创建新的 Worker 吗?嵌套 Worker 有什么限制”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕支持嵌套专用 Worker,但注意共享和 Service Worker 的差异。
解释 Web Worker 可访问与不可访问的 API 边界:独立全局作用域无 window 和 DOM,但保留网络、存储、定时器等能力,并给出工程判断方法。
围绕“有哪些常见的 Worker 内存泄漏场景,比如忘记 terminate 或停止端口”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕不用的 worker 和端口要关闭,注意事件监听。
围绕“MessageChannel 和 MessagePort 与 Worker 的 postMessage 有什么关系”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕如何用 MessageChannel 让两个 Worker 直接通信。
围绕“在 Worker 中用 type='module' 加载 ES 模块脚本与经典脚本有何不同”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕支持 import/export,且为异步加载。
围绕“在 Worker 中可以使用 XMLHttpRequest 或 fetch 发起网络请求吗”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕支持 XHR 和 fetch,但注意同源策略与 CORS。
围绕“在 Worker 中监听消息时,用 onmessage 属性和 addEventListener('message'”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕事件处理器属性覆盖行为与多个监听器共存。
围绕“当需要并行执行多个计算任务时,使用一个 Worker 池(pool)比单个 Worker 有什么好处”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕多个 worker 提升并行度,但注意资源开销。
围绕“在 Worker 与主线程之间如何处理请求-响应的模式(如消息 ID)?没有现成的 API,怎么实现”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕如何用 message data 的 id 字段匹配响应。