在 ES6 class 的构造器中必须先调用 super() 吗?为什么?
本题解析为什么派生类构造器必须先调用 super(),以及调用顺序对 this 绑定、字段初始化的影响。通过示例展示正确用法与错误边界。
JavaScript面试题第 5 页,显示第 201–250 题,共找到 285 道完整解析,可继续按分类、标签与关键词缩小范围。
按稳定语义路径排序
本题解析为什么派生类构造器必须先调用 super(),以及调用顺序对 this 绑定、字段初始化的影响。通过示例展示正确用法与错误边界。
围绕“在 class 类字段中箭头函数定义的实例方法相比原型方法有什么性能或功能差异”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕类字段箭头函数每次实例创建时都会生成新函数,导致多份实例方法内存开销,但可以在构造函数前捕获 this。
本文解释构造函数显式返回对象或原始值时 new 表达式的行为差异。通过代码演示对象覆盖新建实例、原始值被忽略的机制,并给出识别与利用该行为的判断方法,涵盖函数与 class 构造器的场景。
围绕“在 class 中定义私有字段的语法是什么?私有字段如何实现真正私有”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕使用 # 前缀声明,只能在类内部访问,通过严格词法作用域保证。
围绕“在 ES5 原型继承中,为什么要将子类的 prototype 设置为父类实例?Object.create 如何改进”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖设置 prototype 为父实例是基础,但会共享实例属性,且需要重置 constructor,Object.create 避免构造函数。
围绕“Object.preventExtensions() 后还能给对象新增属性吗?如何判断扩展性”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕禁止新增,但可删改旧属性;通过 Object.isExtensible 判断。
围绕“call、apply、bind 三者的区别与各自的使用场景是什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕call/apply 立即调用,args 分布/数组;bind 返回新函数,预设 this 和参数。
围绕“Object.getPrototypeOf() 与 Object.setPrototypeOf() 在现代 Java”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖用于读取或修改对象的 [[Prototype]],虽然属性 __proto__ 也可,但标准方法更安全,且 class 中可用。
围绕“在 class 中使用 getter/setter 与普通方法有何区别?它们和属性描述符中的 get/set 是什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕class 的 getter/setter 会被定义在原型上,并创建访问器属性描述符,效果等同 defineProperty。
本文讲清 in 运算符与 hasOwnProperty 的本质差别:前者沿原型链可检测到继承属性,后者只关心对象直接定义的键位。同时引入 Object.hasOwn 处理空原型和覆写场景,并给出实际判断步骤。
围绕“两个对象用 Object.is() 比较与 === 有何不同?如何处理 NaN 和 +0/-0”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕Object.is 将 NaN 视为相等,且区分 +0 和 -0,而 === 将两者视为相等。
围绕“Symbol.hasInstance 如何自定义 instanceof 的行为”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕通过在类上定义静态 Symbol.hasInstance 方法来改变 instanceof 结果。
围绕“Object.prototype.isPrototypeOf() 与 instanceof 有何不同”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕isPrototypeOf 检查原型链中是否包含特定对象,instanceof 检查构造函数原型链。
围绕“Object.keys(), Object.getOwnPropertyNames(), Object.getOwn”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕keys 只返回可枚举字符串属性,getOwnPropertyNames 返回所有字符串属性(含不可枚举),symbols 。
围绕“如何不通过继承在多个 class 间共享方法?JavaScript 的 mixin 设计思路是什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕通过 Object.assign 或函数组合将方法混合到原型,避免单一继承的局限。
围绕“使用 Object.create(null) 创建的对象有什么特殊性?哪些方法不可用”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕没有原型,因此没有 hasOwnProperty、toString 等,且不能用于 instanceof 判断。
围绕“configurable:false 的属性有哪些操作被禁止”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕禁止删除、修改描述符(除 writable 改为 false)、不能切换访问器与数据属性。
围绕“可选链 ?. 能安全访问深层属性,它与传统 && 短路有什么不同”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖可选链可以对 null/undefined 返回 undefined,同时短路整个链条;&& 适用于一般真值判断。
围绕“JavaScript 对象中数字键在枚举时的顺序是怎样的?为何会有这种顺序”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖整数索引按升序排列,但只适用于数组索引键,其他按插入顺序;for...in 也遵循。
通过一个同时含普通赋值属性和 defineProperty 属性的对象,展示 enumerable:false 对 for...in 与 Object.keys() 的共同过滤效果,并指出 for...in 还会包含原型链上的可枚举属性,而 Object.keys() 不会。
围绕“用 Object.defineProperty 定义 getter/setter 与字面量访问器有何区别”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖主要区别是两种写法的语法不同,但行为一致,且都可定义可枚举/可配置等属性。
本题说明 writable:false 属性在严格模式赋值抛 TypeError、非严格模式静默失败且值不变,并讲解描述符机制、配置对象场景、易失效边界与可操作的检查方式。
本文阐明 JavaScript 原型链上属性查找的精确次序,涵盖自身属性优先、逐级上溯至 null、遮蔽效应、this 绑定和运行时原型修改影响,并通过实际代码和工程场景帮助理解。
围绕“Proxy 的 get 陷阱如何应用在属性读取上,尤其是在链式调用中”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕get 陷阱可以在读取属性时返回自定义函数或值,用于链式调用、自动绑定等。
围绕“如果目标对象具有不可配置且不可写的数据属性,Proxy 的 set 陷阱必须返回什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕满足不变量:如果目标属性不可写且不可配置,则不能修改其值,set 必须返回 false。
围绕“JavaScript 的 Object.freeze() 与深度冻结有何区别?如何实现深度冻结”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕freeze 只冻结对象自身,深度冻结需递归检查并冻结嵌套对象,注意循环引用。
围绕“Reflect.ownKeys() 返回的键顺序是怎样的?与 Object.keys() 有何不同”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕返回所有自身键(含不可枚举和 symbol),顺序为整数索引升序、字符串顺序、最后 symbols;与 keys 不同在于 。
围绕“Reflect.set 与普通赋值在行为上有什么异同”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕Reflect.set 返回布尔值,且可通过 receiver 指定 this;赋值不抛出(严格模式可能)。
围绕“如何创建一个可撤销的 Proxy?撤销后操作会怎样”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕通过 Proxy.revocable 创建,调用 revoke 函数后任何捕获操作都抛出 TypeError。
围绕“Object.seal() 与 Object.freeze() 分别允许哪些修改操作”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕seal 禁止增删属性但允许修改现有属性值;freeze 使属性不可写且属性不可配置。
围绕“什么是深拷贝?如何实现深度克隆一个对象,包括处理循环引用”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕深拷贝创建独立结构,循环引用可通过 WeakMap 记录,或使用 structuredClone。
围绕“对象扩展运算符 { ...obj } 会复制哪些属性?非可枚举属性会被复制吗”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕只复制自身的可枚举属性,不复制原型链,也不复制不可枚举。
围绕“ES6 class 的静态方法会被子类继承吗?如何调用”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕静态方法通过 [[Prototype]] 链继承,子类可以访问,也可在子类中覆盖。
围绕“如何通过 Symbol.toStringTag 来自定义 Object.prototype.toString 的行为”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖从 ES6 起,toString 会查找对象的 Symbol.toStringTag 属性来返回自定义标签。
围绕“如何用 WeakMap 模拟 class 的私有状态?相比 # 私有字段有什么优劣”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕WeakMap 键为实例,外部不可见,但需要闭包和模块作用域,不能防止遍历;对比 # 的严格语法。
围绕“为什么将数组强制转换为字符串时,空数组会得到空字符串,而 [1,2] 得到 '1,2'”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖解释 Array.prototype.toString 调用 join 的机制,以及 null 和 undefined 元素转为空,区别。
围绕“为什么 typeof [] 返回 'object' 而不是 'array'?如何准确判断一个值是否为数组”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖解释 typeof 对引用类型的局限,推荐使用 Array.isArray,并指出跨 frame 情形。
围绕“BigInt 是新增的原始类型,它与 Number 在运算和类型转换上有哪些主要限制”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕强调 BigInt 与 Number 不能混合运算,且不能与 Math 方法使用,需显式转换并注意精度损失。
围绕“创建 BigInt 值时,字面量和构造函数有何区别?如何避免意外转为 Number”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要比较 10n 与 BigInt(10) 的用法,注意 BigInt('10') 与 BigInt(10.1) 的不同,以及不能使用运。
围绕“在条件判断中,除了布尔值还有哪些值会被转换为假值?请列出完整的假值列表”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须给出六个假值:undefined、null、0、-0、NaN、'',并指出对象包括空数组是真值。
围绕“new Boolean(false) 与布尔原始值 false 有何不同?在条件判断中它表现如何”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖指出包装对象永远是 truthy 对象,因此 new Boolean(false) 为 truthy,提醒不要使用包装对象。
围绕“访问字符串中某个字符,charAt、charCodeAt 与 codePointAt 有何区别?对表情符号时应使用哪”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕必须阐述索引位置、码元与码点的区别,并给出获取完整字符的正确方法。
围绕“为什么 [] == ![] 为真,而 [] == [] 为假?请用类型转换规则解释”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖关键是分解 ![] 转换为 false,再调用 ToNumber 导致 '' == 0,同时涉及引用比较于对象比较。
围绕“为什么使用 == 比较字符串与数字时会先进行数字转换?这会导致哪些经典陷阱”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 ToNumber 转换规则,例如 '0' == false 为 true 等,并建议使用严格相等。
围绕“JavaScript 中宽松相等(==)与严格相等(===)在比较 null 和 undefined 时有怎样的区别”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖指出 null == undefined 为 true,且两者与其他值宽松相等均为 false,练习不扩展对象转换。
围绕“数字字面量中的指数表示法(如 1e3)与普通乘法有何区别?它有哪些常见误用”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明指数意义为乘以 10 的幂,注意 1e-3 与 1e+3 等,以及在 parseInt 等中的滥用。
围绕“JavaScript 如何表示无穷大和负无穷大?哪些运算会产生这两个值”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕提及全局属性 Infinity、Number.NEGATIVE_INFINITY、除以零等产生方式,并说明比较与转换行为。
本文对比 typeof 与 instanceof 在类型检查中的适用场景与缺陷,包括原始类型、包装对象、跨 realm 问题,并给出可操作判断建议。
本文阐述Number的安全整数边界,即MAX_SAFE_INTEGER=2^53-1,解释双精度尾数对其限制,并演示超出后出现的精度丢失现象,最后介绍使用BigInt作为解决方案,以及用Number.isSafeInteger进行验证。
围绕“JavaScript 中的逻辑或(||)与逻辑与(&&)返回的是否总是布尔值?实际中如何利用这一特性”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖解释返回操作数而非强制布尔,因此可用于默认值和条件执行,如 expr || defaultValue,并说明空串问题。