JavaScript原始类型有7种:string、number、boolean、null、undefined、symbol、bigint;其余均为对象类型,包括Object、Array、Function等。typeof对原始类型基本可靠(null除外),但对所有对象均返回"object",故无法区分数组、日期等;准确判断应使用Object.prototype.toString.call(),它通过[[Class]]标签返回统一格式字符串,如"[object Array]",且跨环境稳定可靠。

JavaScript 中的原始类型和对象类型有哪些
JavaScript 有 7 种原始(primitive)类型:string、number、boolean、null、undefined、symbol、bigint。其余都是对象类型,包括 Object、Array、Function、Date、RegExp、Map、Set、Promise,以及自定义的类实例等。
注意:typeof null 返回 "object" 是历史遗留 bug,不能靠它判断 null;typeof [] 和 typeof {} 都返回 "object",也无法区分数组和普通对象。
用 typeof 判断原始类型时要注意什么
typeof 只对原始类型基本可靠(除 null),对函数返回 "function" 是特例,但对所有其他对象一律返回 "object",因此它不是“万能类型检测工具”。
-
typeof "hello"→"string" -
typeof 42→"number" -
typeof true→"boolean" -
typeof undefined→"undefined" -
typeof Symbol()→"symbol" -
typeof 1n→"bigint" -
typeof null→"object"(❌ 错误,需单独判断) -
typeof []→"object"(❌ 无法识别数组)
如何准确判断数组、日期、正则等内置对象类型
推荐统一使用 Object.prototype.toString.call(),它是目前最可靠、可扩展的类型检测方式。每个内置构造器在内部都设置了 [[Class]] 标签,toString 方法会读取并格式化为 [object Xxx] 字符串。
立即学习“Java免费学习笔记(深入)”;
Object.prototype.toString.call([]) // "[object Array]" Object.prototype.toString.call(new Date()) // "[object Date]" Object.prototype.toString.call(/abc/) // "[object RegExp]" Object.prototype.toString.call(null) // "[object Null]" Object.prototype.toString.call(undefined) // "[object Undefined]" Object.prototype.toString.call(123) // "[object Number]"
你可以封装一个通用函数:
function getType(value) {
return Object.prototype.toString.call(value).slice(8, -1);
}
getType([1, 2]) // "Array"
getType(new Set()) // "Set"
getType(Promise.resolve()) // "Promise"
为什么不用 instanceof 或构造器名判断
instanceof 在跨 iframe 或不同执行上下文(如 Web Worker)中会失效,因为不同环境中的 Array 构造器是不同引用;而直接访问 value.constructor.name 不仅不可靠(可被篡改),对原始值还可能报错(如 42.constructor 是 undefined)。
-
[] instanceof Array在当前窗口下成立,但在 iframe 里创建的数组会返回false -
({}).constructor === Object可能被重写,比如obj.constructor = null -
42.constructor报TypeError(原始值没有属性访问能力,JS 会临时包装,但constructor属性不在包装对象上)
真正需要高精度判断时,Object.prototype.toString 是唯一不依赖运行时环境、不依赖可变属性、且覆盖全部标准类型的方案。










