# 1. var、let、const 在提升与暂时性死区的差异 A let 声明的变量不会发生提升 B var 声明在 TDZ 期间访问会抛 ReferenceError C let/const 会被提升但处于未初始化状态,TDZ 内访问抛 ReferenceError,const 绑定不可重新赋值 ✓ 正确答案 D const 声明的对象属性无法修改
# 2. 执行上下文、词法环境与作用域链的协作 A 词法环境的外部引用 outer 构成作用域链,变量解析沿链逐级上溯,链在定义时静态确定 ✓ 正确答案 B 作用域链在函数调用时动态确定,与定义位置无关 C var 声明保存在词法环境中 D 每个函数调用共享同一个执行上下文
# 3. 原始类型、引用语义与隐式转换(ToPrimitive/ToNumber/ToString) A 对象比较时比较的是内容是否相等 B ToPrimitive 的 hint 为 default 时永远先调用 toString C null == undefined 的值为 false D 原始类型按值传递且不可变,对象按引用传递,== 会触发隐式类型转换而 === 不会 ✓ 正确答案
# 4. Array.prototype 的 PACKED/HOLEY 双形状过渡与 array 性能取舍 A PACKED 数组访问性能总是比 HOLEY 差 B V8 数组的元素形状只会从精细向粗放单向降级,混用类型或制造空洞都会触发降级 ✓ 正确答案 C 数组形状可以随操作自由升级回退 D new Array(1000) 预创建数组不会产生空洞
# 5. V8 垃圾回收的 Orinoco(Major GC)增量标记、并行、并发三阶段工程价值 A 并行与并发是同一回事 B 并发标记完全由主线程执行 C 增量标记可以把 GC 工作切分并穿插执行,配合写屏障保证正确性 ✓ 正确答案 D 现代 V8 仍是全停顿式 GC,不存在增量标记
# 6. V8 TurboFan 优化条件(单态/多态/巨态)与 Megamorphic 的工程规避 A 巨态调用点仍然会被 TurboFan 内联优化 B 保持对象形状稳定、固定属性顺序可以避免调用点退化为巨态 ✓ 正确答案 C 多态比单态优化得更好 D IC 记录的是变量名而不是对象形状
# 7. V8 隐藏类(Hidden Classes / Maps)与内联缓存在对象属性访问的性能价值 A 隐藏类与对象结构无关 B 属性访问总是退化为字典查找 C 相同结构对象共享隐藏类,IC 缓存(隐藏类→偏移)加速属性访问 ✓ 正确答案 D 动态添加属性不影响隐藏类共享
# 8. with 语句在严格模式下的禁用与替代方案 A with 能显著提升属性访问性能 B with 在严格模式下仍然可用 C 严格模式禁用 with 是因为它会破坏静态作用域分析与引擎优化,工程上可用解构赋值替代 ✓ 正确答案 D with 不会影响变量解析
# 9. typeof 与 instanceof 的边界场景(跨 Realm、Symbol.toStringTag) A Symbol.toStringTag 无法改变 Object.prototype.toString 的输出 B typeof null 的结果是 "null" C instanceof 不受原型链影响 D instanceof 基于原型链判断,跨 Realm 时可能失效,而 Symbol.toStringTag 可以影响 Object.prototype.toString 的结果 ✓ 正确答案
# 10. Object.is() 与 === 在 NaN/+0/-0 的关键差异 A NaN === NaN 返回 true B Object.is 与 === 完全等价 C Object.is(+0, -0) 返回 true D Object.is(NaN, NaN) 返回 true,Object.is(+0, -0) 返回 false,而 === 与之相反 ✓ 正确答案
# 11. JS Number 的 IEEE 754 双精度浮点数精度问题与 Number.EPSILON 边界 A Number.EPSILON 用于误差容差比较,浮点相等判断应使用容差而非直接 === ✓ 正确答案 B 0.1 + 0.2 在 JS 中精确等于 0.3 C JS Number 能精确表示所有十进制小数 D Number.MAX_SAFE_INTEGER 之外所有整数仍可精确表示
# 12. 原型链、__proto__、prototype、constructor 的关系 A 对象没有原型链概念 B 所有对象的原型链顶端是 Function.prototype C __proto__ 与 prototype 是同一个属性 D 实例的 __proto__ 指向构造函数的 prototype,且 prototype.constructor 回指构造函数 ✓ 正确答案
# 13. this 绑定规则(默认、隐式、显式、new、箭头)的优先级 A new 绑定优先级最高,箭头函数 this 在定义时词法捕获且无法被 call/apply/bind 修改 ✓ 正确答案 B 隐式绑定优先级高于显式绑定 C 箭头函数的 this 由调用方式决定 D 非严格模式独立调用时 this 为 undefined
# 14. 闭包的词法环境捕获与 Retainer Path 排查 A 闭包捕获的是变量的值快照 B 闭包在函数返回后自动释放捕获的变量 C 闭包捕获的是词法环境的引用,可通过 DevTools 的 Retainer Path 查看从 GC 根到对象的引用链来排查泄漏 ✓ 正确答案 D Retainer Path 无法显示闭包上下文
# 15. V8 TurboFan Maglev/Sparkplug 在性能优化与 GC 压力的取舍 A Sparkplug 是 V8 最激进的优化编译器 B 优化层级越高执行越快,但编译开销与内存占用也越大,需在性能与 GC 压力间权衡 ✓ 正确答案 C 优化永远不会增加内存占用 D Maglev 只做解释执行
# 16. == 隐式类型转换的完整规则链与经典判断([]==![] 为 true、null==undefined 为 true、{}+[] 的解析歧义) A null == 0 为 true B [] == ![] 的结果是 false C null == undefined 恒为 true,对象参与 == 会先 ToPrimitive 再数值化比较 ✓ 正确答案 D {}+[] 无论上下文结果都相同
# 17. Symbol.for() 与 Symbol() 的全局注册表与跨 Realm 行为差异 A Symbol.for(key) 基于全局注册表复用符号,跨 Realm 也共享,而 Symbol() 每次创建全新符号 ✓ 正确答案 B Symbol() 创建的符号也会进入全局注册表 C Symbol.for 与 Symbol 完全等价 D Symbol.keyFor 可以查询任意 Symbol 的 key
# 18. Intl.NumberFormat 在货币、千分位、单位格式化上的工程化应用 A currencyDisplay 只影响数字本身 B Intl.NumberFormat 只能处理整数 C Intl.NumberFormat 支持货币、千分位与单位格式化,且实例可复用以避免重复构造开销 ✓ 正确答案 D compact 记法会丢失所有精度
# 19. Intl.Segmenter 在 CJK 文本分词与词边界检测的能力 A Intl.Segmenter 只能处理英文 B String.prototype.split("") 可以正确处理 emoji 组合字符 C 正则 \b 完全支持中文分词 D Intl.Segmenter 按 grapheme/word/sentence 粒度切分文本,CJK 分词依赖 Unicode 断字规则而非空格 ✓ 正确答案
# 20. Map/Set 与 WeakMap/WeakSet 的键类型、迭代顺序与 GC 行为 A WeakMap 键只能是对象且弱引用,无迭代能力,适合关联元数据防泄漏 ✓ 正确答案 B WeakMap 可以遍历并查看 size C Map 的键只能是对象 D WeakMap 对值也持有弱引用
# 21. BigInt 与普通数字的混合运算规则 A 1n + 1 的结果是 2n B BigInt 与 Number 的算术混合运算直接抛 TypeError,必须显式转换 ✓ 正确答案 C BigInt 可以安全地用 Number() 任意转换而不损失精度 D 1n === 1 为 true
# 22. Symbol 类型与内置 Symbol(Symbol.iterator、Symbol.toPrimitive 等) A Symbol.iterator 决定对象的序列化方式 B Symbol 属性可以被 Object.keys 枚举 C Symbol 键不可被 for...in 枚举,Symbol.iterator 等内置 Symbol 定义语言协议 ✓ 正确答案 D Symbol 值可以隐式转换为字符串
# 23. 严格模式对变量声明、this、静默错误的影响 A 严格模式允许删除不可配置属性 B 严格模式下未声明赋值抛 ReferenceError,独立调用的 this 为 undefined ✓ 正确答案 C 严格模式下 this 始终指向 window D 严格模式禁止使用函数
# 24. finalizationRegistry 与 WeakRef 在大对象延迟释放的工程价值 A FinalizationRegistry 清理回调在 GC 后异步触发且时机不确定,不能依赖它做关键资源清理 ✓ 正确答案 B WeakRef.deref 返回的对象可以安全长期持有 C WeakRef 阻止对象被垃圾回收 D 清理回调一定会立即执行
# 25. globalThis 在多环境(浏览器/Worker/Node)的统一访问与 polyfill 治理 A polyfill 应该使用环境字符串判断 B ESM 模块顶层 this 就是全局对象 C globalThis 在 Worker 中不存在 D globalThis 是跨环境统一的全局对象引用,ESM 模块顶层 this 为 undefined,取全局对象应使用 globalThis ✓ 正确答案
# 26. Date.parse 的实现差异与 Temporal 替代的工程意义 A Date.parse 解析失败会抛异常 B Date.parse 对所有格式解析结果一致 C Temporal 与 Date 使用相同的时间模型 D Date.parse 对非 ISO 格式解析因实现而异,Temporal 以强类型时间模型消除时区与解析歧义 ✓ 正确答案
# 27. Array.prototype.flat/flatMap 在稀疏数组与类数组对象的行为差异 A flat 展平时会跳过稀疏数组空洞,flatMap 等价于先 map 再 flat(1) ✓ 正确答案 B flatMap 等价于 map 后再 flat(2) C flat 与 flatMap 会自动转换类数组对象 D flat 不会处理空洞
# 28. Object.freeze/seal/preventExtensions 的浅冻结与递归冻结 A seal 会让属性变为只读 B freeze 限制力度最强但仍是浅层操作,深冻结需要递归处理嵌套对象与循环引用 ✓ 正确答案 C preventExtensions 禁止修改现有属性 D freeze 后嵌套对象自动不可变
# 29. 属性描述符(writable、enumerable、configurable、get/set)的控制能力 A 访问器描述符同时可以拥有 value B writable:false 的属性仍然可以通过 delete 删除 C enumerable 控制属性是否出现在 for...in/Object.keys 中,configurable:false 的属性不可删除且描述符不可再改 ✓ 正确答案 D configurable:false 之后仍可把 writable 改回 true
# 30. 词法作用域与动态作用域的区别,为何说 JS 的 this 是其唯一的动态作用域机制 A JS 的变量解析遵循词法作用域,而 this 在调用时按调用方式动态绑定,是唯一的动态绑定机制 ✓ 正确答案 B JS 的变量查找沿调用栈进行 C 闭包捕获的是调用者的变量 D this 在定义时确定
# 31. 手写 call/apply/bind 的关键点(Symbol 唯一键挂载、this 绑定、bind 返回函数被 new 的处理) A 手写 bind 需处理柯里化参数、new 调用时忽略原 this 且保留原型链,因此不能用箭头函数实现 ✓ 正确答案 B bind 返回的函数被 new 调用时 this 仍指向 bind 的目标 C call/apply 手写时不需要处理 null/undefined D bind 返回函数的 prototype 与目标无关