javascript中判断“对象”需区分狭义普通对象和广义引用类型:用object.prototype.tostring.call()可精准识别纯对象;用typeof val === 'object' && val !== null可判断所有非原始值引用类型;注意null的bug及数组、函数等类型的特殊性。

在 JavaScript 中判断一个值是否为“对象”,关键要明确你指的“对象”是狭义的普通对象(如 {}),还是广义的引用类型(包括数组、函数、正则、日期等)。不同场景需要不同的判断方式,下面分几种常见需求说明。
只认纯对象(Plain Object):用 Object.prototype.toString.call()
这是最可靠的方式,能准确区分普通对象、数组、函数、null、undefined 等:
function isPlainObject(val) {
return Object.prototype.toString.call(val) === '[object Object]';
}
isPlainObject({}); // true
isPlainObject([]); // false
isPlainObject(null); // false
isPlainObject(undefined); // false
isPlainObject(new Date()); // false
isPlainObject(/abc/); // false
排除 null,但接受所有引用类型(含数组、函数等)
如果只要“不是原始值”,可结合 typeof 和 null 特殊处理:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
function isObject(val) {
return typeof val === 'object' && val !== null;
}
isObject({}); // true
isObject([]); // true
isObject(function(){}); // true
isObject(null); // false
isObject(42); // false
isObject('str'); // false
严格只认普通对象(不含数组、类数组、实例等)
除了 toString 方法,还可用 constructor 或 Object.getPrototypeOf 辅助验证:
function isPlainObject(val) {
if (typeof val !== 'object' || val === null) return false;
return Object.getPrototypeOf(val) === Object.prototype;
}
// 或更兼容旧环境的写法:
function isPlainObject(val) {
return val !== null &&
typeof val === 'object' &&
val.constructor === Object;
}
注意几个常见陷阱
-
typeof null === 'object'—— 这是 JS 历史 bug,必须显式排除null -
数组、正则、日期等都返回
'object'—— 单靠typeof无法区分 -
函数返回
'function',不属于typeof 'object',但它是对象(可添加属性) -
ES6 的
Map、Set、Promise等也属于对象,但toString.call会返回对应类型字符串,如[object Map]
不复杂但容易忽略。按需选择方法即可。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










