标准答案

  1. 数据类型:JavaScript 可以先分成原始类型和对象类型。原始类型包括 undefined、null、boolean、number、bigint、string、symbol;对象类型包括普通对象、数组、函数、Date、RegExp、Map、Set 等。函数本质上也是对象,只是 typeof function 会返回 "function"。
  2. typeof:适合判断大多数原始类型和函数,但 typeof null 是 "object",数组、日期、正则和普通对象也都会得到 "object"。数组判断优先用 Array.isArray。
  3. instanceof:判断某个构造函数的 prototype 是否出现在对象原型链上,适合同一运行环境下判断自定义类、Date、RegExp 等,但跨 iframe 或多 realm 可能失效。
  4. Object.prototype.toString:更适合做通用类型判断,它会返回类似 [object Array]、[object Date]、[object Null] 的内部标签。工程里普通业务先用最清楚的原生 API;只有组件库、SDK、跨窗口数据这类场景才需要更稳的判断。

题目解析

关键不是背类型列表,而是解释每种判断方式的边界。typeof 的优势是简单,缺点是对象类型区分能力弱;instanceof 的优势是和原型链一致,缺点是依赖运行环境;toString 的优势是覆盖面更稳定。

null 是原始类型,但 typeof null 返回 object,这是历史遗留问题。BigInt 和 Symbol 是 ES 新增原始类型,typeof 结果分别是 "bigint" 和 "symbol"。

代码示例

类型判断通常组合使用,不要指望一个 API 覆盖所有业务场景。

JavaScript
typeof 1 // "number"
typeof null // "object"
typeof function fn() {} // "function"

Array.isArray([]) // true
Object.prototype.toString.call(new Date()) // "[object Date]"
Object.prototype.toString.call(null) // "[object Null]"

常见误区

  • 误以为 typeof 可以准确区分所有对象类型。
  • 误以为 instanceof 在所有场景都可靠,忽略跨 iframe 或多运行上下文。
  • 忘记 null 是原始值,但 typeof null 的历史结果是 object。

作者信息