javascript判断数据类型需分层处理:先用typeof识别基本类型(null除外),再用array.isarray()判数组,最后用object.prototype.tostring.call()精确识别内置对象类型,避免instanceof和constructor的兼容性问题。
javascript 判断数据类型不能只靠一种方法,得按数据特征分层处理:先快速筛基本类型,再精准识别对象子类,最后兼顾边界和兼容性。
优先用 typeof 处理基本类型
它速度快、语法简单,对 string、number、boolean、undefined、symbol、bigint 全部返回准确的小写字符串。唯一例外是 null —— 它会错误返回 "object",所以判断 null 必须单独用 value === null。
-
typeof "abc"→"string" -
typeof 42→"number" -
typeof true→"boolean" -
typeof undefined→"undefined" -
typeof Symbol()→"symbol" -
typeof 123n→"bigint" -
typeof null→"object"(❌不可信,需单独判断)
数组必须用 Array.isArray()
这是 ECMAScript 标准推荐的唯一可靠方式。typeof [] 和 instanceof Array 都有缺陷:typeof 返回 "object",而 instanceof 在跨 iframe 场景下会失效(因不同全局环境的 Array 构造函数不共享原型)。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
-
Array.isArray([])→true -
Array.isArray({})→false -
Array.isArray(new window.parent.Array())→true(跨 iframe 仍有效)
精确识别所有内置对象类型用 Object.prototype.toString.call()
它是目前最通用、最稳定的方案,能返回标准内部标签,比如 [object Date]、[object RegExp]、[object Map]、[object Promise] 等。该方法不受原型链篡改影响,且兼容所有环境(包括跨 iframe)。
-
Object.prototype.toString.call(new Date())→"[object Date]" -
Object.prototype.toString.call(/abc/)→"[object RegExp]" -
Object.prototype.toString.call(new Set())→"[object Set]" - 提取类型名可统一写成:
Object.prototype.toString.call(value).slice(8, -1).toLowerCase()
慎用 instanceof 和 constructor
instanceof 适合检查自定义类实例或明确继承关系(如 obj instanceof MyClass),但对内置类型不普适,且在多全局环境(iframe、Service Worker)中不可靠。constructor 更危险——属性易被覆盖,obj.constructor === Array 可能为 false 即使它真是数组。
-
{} instanceof Object→true,但{} instanceof Array→false -
let arr = []; arr.constructor = String; arr instanceof Array→false(已失真) -
arr.constructor === Array→false(不可信)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










