类型与作用域机制

共 31 题
#

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 与目标无关