JSON.stringify 在处理 BigInt 值时会抛错,如何设计自定义序列化来支持它?
围绕“JSON.stringify 在处理 BigInt 值时会抛错,如何设计自定义序列化来支持它”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明默认 TypeError,可给对象实现 toJSON 或将 BigInt 转为字符串再序列化。
程序员面试题库第 46 页,收录第 2251–2300 题,共 5000 道完整解析,覆盖前端、JavaScript、React、Vue、Node.js、AI Agent、网络、数据库与系统设计。
按稳定语义路径排序
围绕“JSON.stringify 在处理 BigInt 值时会抛错,如何设计自定义序列化来支持它”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明默认 TypeError,可给对象实现 toJSON 或将 BigInt 转为字符串再序列化。
围绕“JSON.stringify 遇到循环对象会抛出什么错误?除手动处理外,有哪些常用替代方案”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 TypeError: Converting circular structure to JSON,并提及可检测或使用替代序列化。
围绕“JSON.stringify 如何序列化 NaN 和 Infinity?为何这些值不能直接出现在 JSON 中”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明它们在非数组属性上被序列化为 null,并解释 JSON 不接受 Number 的 NaN。
围绕“JSON.parse 的 reviver 参数如何处理日期字符串,从而避免自动转换的陷阱”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖要求说明 reviver 可拦截每个键值并转换,应用场景是将 ISO 日期字符串变为 Date 对象。
围绕“JSON.stringify 的 replacer 参数如何过滤或转换对象中的属性”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖要求解释 replacer 可为函数或数组,且递归访问每个键值对以决定是否保留。
围绕“JSON.stringify 在序列化包含 undefined、函数和 Symbol 值的对象时如何处理这些值”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖要求说明这些值在数组中被序列化为 null,在对象中被忽略,在个别属性上下文中返回 undefined。
围绕“JavaScript 正则中 s 标志 (dotAll) 的作用是什么,与 m 标志的区别”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 s 使 . 匹配换行符,m 改变 ^ $ 的行为,两者独立。
围绕“当正则使用 g 或 y 标志时,如何手动重置其 lastIndex 以避免跳过匹配”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 exec/test 会更新 lastIndex,因此需手动置 0 或使用循环。
讲解 JavaScript 正则四种环视断言的语法、零宽语义与浏览器支持差异,给出提取等号后数字的实例与旧环境下后顾断言的降级方案。
围绕“String.prototype.matchAll 与循环使用 exec() 相比有什么改进”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖要求说明 matchAll 返回包含捕获组的迭代器且不需要手动更新 lastIndex,并支持命名组。
比较 JavaScript 正则中命名捕获组与数字捕获组的写法、结果对象属性(groups 与下标)、反向引用(\k<name> 与 \1)及 replace 中的引用方式,并给出使用边界。
解释 JavaScript 正则中量词默认贪婪、加 ? 转懒惰的机制,用标签配对场景对比两种写法对匹配范围和捕获组结果的影响,并给出判断边界。
本题剖析 JavaScript 正则 sticky(/y)与 global(/g)在匹配起点和 lastIndex 更新上的不同表现,指出 /y 强制锁定起点而 /g 可向右扫描,并澄清失败时 lastIndex 的重置规则。
围绕“如何用 Unicode 属性转义在 JavaScript 正则中匹配特定字符类别”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖解释 \p{Script=...}, \p{Letter} 等的用法,并说明必须启用 u 标志。
围绕“使用 TextDecoder 的 stream: true 选项处理分块数据时,为什么需要传递 true”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 stream 模式允许暂未完成的字符缓存,直到后续 chunk 补齐;否则会替换/丢失字符。
围绕“当字节流不是合法 UTF-8 时,TextDecoder 默认如何处理,如何改变处理方式”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖要求说明 fatal 选项是否抛出异常,以及 ignoreBOM 选项的作用。
围绕“使用 TextEncoder 将字符串转换为 Uint8Array 时,为什么输出是 UTF-8 编码”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 TextEncoder 始终按 UTF-8 编码,且不支持其他编码,用途与 TextDecoder 配合。
围绕“类型化数组(如 Uint8Array)与普通数组在内存表示和 API 上有哪些关键差异”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 typed array 是 ArrayBuffer 的视图、元素固定长度、连续内存,且没有 push/pop 等方法。
围绕“类型化数组的 subarray 与 slice 有什么区别,各在什么场景下使用”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 subarray 返回共享内存的新视图,slice 复制生成独立 buffer。
围绕“在正则中使用 unicode 标志 (/u) 对处理 emoji 和特殊字符有何影响”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 /u 启用 Unicode 模式,使 . 和量词按码点匹配,且可识别代理对。
围绕“JavaScript 中字符串的 normalize 方法在比较 accented 字符时为什么重要”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖要求说明不同码点序列可视觉相同,normalize 将其统一,从而比较稳定。
围绕“用 JavaScript 反转一个含有 emoji 的字符串会遇到什么问题,如何正确实现”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明简单 split('') 反转会破坏代理对,需用 Array.from 或基于码点的方法。
围绕“为什么 JavaScript 字符串中 emoji 等字符的长度有时是 2,如何正确遍历所有 Unicode 字符”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖解释 UTF-16 代理对,length 属性失真,for...of 可按码点遍历。
围绕“在严格模式下为什么不能访问 arguments.callee?还有别的替代方案”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明让递归具名与性能原因,并给出命名函数表达式或默认参数替代。
讲解 arguments 转数组的三种方法及差异:slice.call 兼容性最好、Array.from 语义清晰、展开运算符最简洁,并说明箭头函数无 arguments、剩余参数可替代。
本文解释 arguments 与命名函数参数的根本不同:arguments 保存全部实参、是类数组但不继承 Array 方法,以及实参与形参在普通、严格和默认参数下的同步规则,并给出判断边界。
本题解释箭头函数为何无自身 arguments,基于词法作用域机制;说明可通过外层作用域引用取得外层函数的 arguments,并推荐剩余参数作为更清晰的替代方案,同时指出全局作用域下 arguments 不存在的边界。
本文解释箭头函数 this 的词法绑定机制:没有自身 this、继承外层函数、call/apply/bind 无效,并给出场景与边界。
围绕“异步生成器(async generator)与普通生成器有何不同”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 next() 返回 Promise,可 await 异步操作。
讲解 Function.prototype.bind 与 call/apply 的本质差异:bind 创建永久绑定 this 的新函数并支持预置参数,call/apply 为单次调用指定 this。结合 setTimeout、构造函数等场景说明边界。
围绕“JavaScript 函数参数是按值传递还是按引用传递?对象作为参数时表现如何”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要解释按值传递但引用类型传的是引用副本,修改属性会影响原对象,而重新赋值不影响。
围绕“将对象方法作为回调函数传入 setTimeout 时,为什么 this 会丢失?如何解决”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要解释引用传递时 this 变为全局,并给出 bind 或箭头函数解决方案。
围绕“为什么用 var 声明的循环变量在异步回调中会得到最终值?如何修复”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要解释 var 函数作用域共享,以及用 let 或 IIFE 创建每层作用域。
围绕“闭包是如何导致内存泄漏的?如何避免”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明闭包长存引用导致被引变量无法回收,并提供改进如及时置 null。
围绕“用闭包实现柯里化(currying)的基本原理是什么?给出简单实现”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需利用闭包收集参数、返回新函数,直到参数足够。
本题考查 JavaScript 默认参数的求值时机:每次调用时才计算、从左到右初始化、可引用前面参数,但无法访问函数体内部变量,并解释参数作用域与暂时性死区的关系。
围绕“函数声明与函数表达式在作用域和提升上有何区别”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明声明整体提升、表达式仅变量提升,以及命名函数表达式的名称作用域。
围绕“所有函数都有 prototype 属性吗?箭头函数为什么没有”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明普通函数有 prototype,箭头函数和异步生成器没有等,不可用 new。
围绕“JavaScript 生成器函数(generator)是如何工作的?yield 与 next 的关系”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕必须描述生成器函数返回可迭代迭代器、yield 暂停恢复、next 返回数据结构。
围绕“生成器产生的对象与普通可迭代对象有何异同”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明生成器对象本身即迭代器、实现 next/return/throw。
围绕“生成器函数能通过 new 调用吗?为什么?new.target 在其中是什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明生成器函数不是构造函数,new 会报错,并提及不能绑定 this 等。
围绕“如何从外部停止一个生成器或向其中抛出异常”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要解释调用 generator.return() 和 generator.throw() 的行为与区别。
围绕“在生成器中,yield 与 return 有何本质区别?且 return 后还能继续 next 吗”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 yield 产生值并保持状态,return 结束生成器,后续 next 为 done: true。
围绕“函数内变量提升(hoisting)对 var 和 let/const 有何区别?能否在声明前访问”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要解释 var 提升为 undefined,let 存在暂时性死区。
围绕“什么是立即执行函数表达式(IIFE)?它的主要用途有哪些”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要解释语法与创建新作用域、隔离变量、配合闭包保存状态等用途。
围绕“使用箭头函数写 IIFE 与普通函数 IIFE 有何本质区别”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖主要区别在于 this 的词法绑定,以及 arguments、new.target 等差异。
围绕“函数 length 属性代表什么?默认参数和剩余参数如何影响它”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 length 是形参个数但不包括默认参数/剩余参数之前的?实际规则。
围绕“JavaScript 词法作用域是如何工作的?作用域链如何形成”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要解释作用域在代码书写时决定,并递归关联外层函数。
围绕“函数对象的 name 属性是如何推断的?箭头函数与匿名函数呢”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明变量赋值、对象属性、默认参数等推断规则,以及箭头函数。
本文解释了 new 调用函数时内部发生的四步流程:创建空对象、原型关联、绑定 this、处理返回值。同时讨论 new.target 的检测、显式返回对象的覆盖情况,以及类与构造函数的差异。