最可靠的方式是Object.prototype.toString.call(),它能精准返回"[object Type]"格式字符串以区分数组、日期、正则等所有内置引用类型,而typeof对多数引用类型均返回"object"且存在null误判问题。

JavaScript 中判断变量是否为引用数据类型,最可靠的方式是结合 typeof 和 Object.prototype.toString.call(),因为 typeof 对所有引用类型(除函数外)都返回 "object",无法区分数组、日期、正则等具体类型,而 toString.call() 能精准识别。
用 Object.prototype.toString.call() 判断
这是最通用、最准确的方法。它能返回类似 "[object Array]"、"[object Date]" 这样的字符串,从而明确区分各类引用类型:
-
Object.prototype.toString.call([])→"[object Array]" -
Object.prototype.toString.call({})→"[object Object]" -
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]"
可封装成工具函数:
function isReferenceType(val) {
const type = Object.prototype.toString.call(val);
return type !== '[object String]' &&
type !== '[object Number]' &&
type !== '[object Boolean]' &&
type !== '[object Symbol]' &&
type !== '[object BigInt]' &&
type !== '[object Undefined]' &&
type !== '[object Null]';
}
注意:typeof 单独用不靠谱
typeof 对大多数引用类型都返回 "object",只有函数例外:
立即学习“Java免费学习笔记(深入)”;
-
typeof []→"object" -
typeof {}→"object" -
typeof new Date()→"object" -
typeof function(){}→"function" -
typeof null→"object"(历史 Bug,需单独处理)
所以仅靠 typeof === 'object' 会把 null、数组、对象、日期等全判为“引用类型”,但漏掉 function(它确实是引用类型),且误把 null 当作有效引用。
快速判断是否为“非原始值”(含函数、对象、数组等)
如果只需粗略区分原始值 vs 引用值(包括函数),可用:
-
val !== null && typeof val === 'object'→ 覆盖对象、数组、日期、正则等,但排除null和function -
typeof val === 'function' || (val !== null && typeof val === 'object')→ 补上函数,基本覆盖所有引用类型
不过仍建议优先使用 toString.call(),逻辑更清晰、边界更可控。
补充:ES6+ 可用 Symbol.toStringTag 自定义类型标识
某些自定义类可通过设置 [Symbol.toStringTag] 影响 toString.call() 的输出,说明该方法是 JS 官方认可的类型检测标准,稳定性高。


















