2618. 检查是否是类的对象实例(JavaScript)

  • 题目链接:https://leetcode.cn/problems/check-if-object-instance-of-class/description/
  • 难度:简单
  • 类型:JavaScript/原型链/类型判断

题目要点

  • 给定 value 与 classFn,判断 value 是否是 classFn 或其超类的实例。
  • 需要考虑 undefined、null、非函数的 classFn。
  • 对原始类型与其包装类(如 5 与 Number)要正确处理。

解法一:instanceof + 原始类型映射(推荐)

  • 思路:
    • 优先用 instanceof 判断对象与原型链关系(内部会调用 Symbol.hasInstance)。
    • 对原始类型做特判,使 number → Number、string → String、boolean → Boolean、bigint → BigInt、symbol → Symbol 返回 true。
    • 非法输入(classFn 非函数或任一为 null/undefined)返回 false。
js 复制代码
/**
 * 检查值是否为给定类或其超类的实例
 * @param {*} value - 任意值
 * @param {*} classFn - 目标类(构造函数)
 * @returns {boolean} - 是否为实例
 */
const checkIfInstance = (value, classFn) => {
  if (classFn == null || value == null || typeof classFn !== 'function') return false
  if (value instanceof classFn) return true
  const t = typeof value
  if (classFn === Number) return t === 'number'
  if (classFn === String) return t === 'string'
  if (classFn === Boolean) return t === 'boolean'
  if (classFn === BigInt) return t === 'bigint'
  if (classFn === Symbol) return t === 'symbol'
  return false
}
  • 复杂度:

    • instanceof 的原型链检查为 O(h)(h 为原型链高度)。
    • 原始类型映射为 O(1)。
  • 边界说明:

    • checkIfInstance(Date, Date) → false(Date 是 Function 的实例)。
    • checkIfInstance(5, Number) → true(与题目示例一致)。
    • checkIfInstance(5, Object) → false(不把原始值视作 Object 的实例)。
    • checkIfInstance(null, Object) → false。

解法二:手写原型链遍历 + 原始类型特判

  • 思路:
    • 对对象与函数:沿 Object.getPrototypeOf 逐层向上,判断是否等于 classFn.prototype。
    • 对原始类型:做与解法一相同的映射特判。
js 复制代码
/**
 * 通过手写原型链判断实例关系
 * @param {*} value - 任意值
 * @param {*} classFn - 目标类(构造函数)
 * @returns {boolean} - 是否为实例
 */
const checkIfInstanceByProto = (value, classFn) => {
  if (classFn == null || typeof classFn !== 'function') return false
  if (value == null) return false
  const t = typeof value
  if (classFn === Number) return t === 'number'
  if (classFn === String) return t === 'string'
  if (classFn === Boolean) return t === 'boolean'
  if (classFn === BigInt) return t === 'bigint'
  if (classFn === Symbol) return t === 'symbol'
  let proto = Object.getPrototypeOf(value)
  const target = classFn.prototype
  while (proto) {
    if (proto === target) return true
    proto = Object.getPrototypeOf(proto)
  }
  return false
}
  • 说明:与 instanceof 等价于遍历原型链的判断,但仍需对原始类型做特判。

解法三:利用 Symbol.hasInstance(了解)

  • 思路:
    • instanceof 内部会调用 classFn[Symbol.hasInstance](value),可显式使用以获得可定制的实例判断行为。
    • 对多数内置类型,直接用 instanceof 即可;手动调用一般用于定制类。
js 复制代码
/**
 * 基于 Symbol.hasInstance 的实例判断
 * @param {*} value - 任意值
 * @param {*} classFn - 目标类(构造函数)
 * @returns {boolean} - 是否为实例
 */
const checkIfInstanceByHasInstance = (value, classFn) => {
  if (classFn == null || value == null || typeof classFn !== 'function') return false
  const hasInst = classFn[Symbol.hasInstance]
  if (typeof hasInst === 'function' && hasInst.call(classFn, value)) return true
  const t = typeof value
  if (classFn === Number) return t === 'number'
  if (classFn === String) return t === 'string'
  if (classFn === Boolean) return t === 'boolean'
  if (classFn === BigInt) return t === 'bigint'
  if (classFn === Symbol) return t === 'symbol'
  return false
}

示例与验证

js 复制代码
class Animal {}
class Dog extends Animal {}

console.log('1:', checkIfInstance(new Date(), Date))            // true
console.log('2:', checkIfInstance(new Dog(), Animal))           // true
console.log('3:', checkIfInstance(Date, Date))                  // false
console.log('4:', checkIfInstance(5, Number))                   // true
console.log('5:', checkIfInstance(() => {}, Function))          // true
console.log('6:', checkIfInstance(5, Object))                   // false
console.log('7:', checkIfInstance(null, Object))                // false
console.log('8:', checkIfInstance(undefined, Number))           // false

总结

  • 推荐以 instanceof 为主,原始类型补充为辅,满足题目示例与语义直觉。
  • 若需要可定制的行为,可考虑 Symbol.hasInstance,但一般场景不必复杂化。
相关推荐
treasure1409 小时前
【复古】浅尝Django前后端不分离
前端·css·python·django·bootstrap·html·web
jay神10 小时前
基于 YOLOv8 的手势识别系统(Web 版)
前端·人工智能·python·深度学习·yolo·计算机视觉·计算机毕业设计
屏什么录10 小时前
长时间录屏中途崩溃:MP4 打不开的 6 种救回方案与参数设置
前端·音视频开发
code_Bo11 小时前
不只命令行:我把跨 Agent 会话同步做成了桌面应用
前端·javascript·后端
kyriewen11 小时前
AI 能把页面写出来,为什么改个需求就开始崩?
前端·javascript·人工智能
OpsEye11 小时前
同一套用例跑两个大模型接口,差异到底出在哪
javascript·ai编程
X1A0RAN12 小时前
PPT 图片批量处理教程:导出全部幻灯片 · 提取全部素材
开发语言·javascript·powerpoint
涛涛ing12 小时前
2026年最值得关注的前端变化,藏在“默认值”里
前端
量化分析码农13 小时前
股票历史数据的复权参数对照:多级别返回的字段与数值差异
java·javascript·后端
亿元程序员14 小时前
太牛了!这AI做出来的游戏,居然还能变现!
前端