JavaScript类型判断需按优先级选用工具:typeof判原始类型,Array.isArray判数组,Object.prototype.toString.call判复杂对象,Number.isNaN单独处理NaN。

JavaScript类型判断看似简单,但真正落地时,null、NaN、数组、日期、Symbol、BigInt这些边界案例最容易引发误判。关键不在于记住所有“例外”,而在于理解每种方法的适用边界和失效场景。
处理 null:别信 typeof
typeof null 返回 "object" 是 JS 历史遗留缺陷,不能用于准确识别 null。
- 正确做法:用严格相等判断
value === null - 若需统一判断“空值”,可组合使用:
value === null || value === undefined,或更简洁地用value == null(仅限此场景下安全) - 注意:
!value会把0、""、false也判为真,不适用于类型判断
区分数组与普通对象:避开 instanceof 的跨 iframe 陷阱
instanceof 在同源 iframe 或不同 JS 环境中可能失效(因 Array 构造函数引用不同)。
- 推荐首选:
Array.isArray(value)—— ES5 标准方法,稳定可靠,无环境依赖 - 兼容旧环境可降级:
Object.prototype.toString.call(value) === "[object Array]" - 避免仅靠
value instanceof Array做核心逻辑判断
识别 NaN:唯一无法用 === 判断的原始值
NaN 不等于任何值,包括它自己。这是唯一一个 === 失效的原始类型值。
- 正确检测:
Number.isNaN(value)(推荐)—— 只对真正 NaN 返回 true,不会把字符串 "NaN" 或空值误判 - 传统方案:
value !== value(仅对 NaN 成立),但可读性差,不建议业务代码使用 - 慎用全局
isNaN():它会先尝试转数字,isNaN("hello")和isNaN(undefined)都返回 true,容易误伤
应对 Symbol、BigInt 等新原始类型:优先用 typeof
Symbol 和 BigInt 属于原始类型,且 typeof 能精准识别它们,无需额外兜底。
-
typeof Symbol("a")→ "symbol" -
typeof 123n→ "bigint" - 注意:不要用
instanceof Symbol或constructor判断,它们不是构造函数实例 - 若需兼容极老环境(如 IE),可结合
typeof+Object.prototype.toString双保险
类型判断不是拼技巧,而是选对工具链。日常开发中,按优先级推荐组合:typeof 判原始类型 → Array.isArray 判数组 → Object.prototype.toString.call 判复杂对象 → Number.isNaN 单独处理 NaN。


















