判断数据是否为纯对象需满足:是对象且非null,原型为object.prototype或null。使用object.getprototypeof()检查原型最可靠,避免constructor被篡改,同时结合object.prototype.tostring.call()排除array、date等非纯对象类型。

判断一个数据是否为 Plain Object(纯对象),核心是确认它是由 {} 字面量或 Object.create(null) 创建的普通对象,且不继承自其他构造函数(比如 Array、Date、RegExp 或自定义类)。最可靠的方式是结合 typeof、constructor 和原型链判断。
用 Object.prototype.toString.call() 判断类型
这是最稳妥的内置方法,能准确识别内置对象类型:
-
Object.prototype.toString.call({}) === '[object Object]'→ true -
Object.prototype.toString.call([]) === '[object Array]'→ false -
Object.prototype.toString.call(new Date()) === '[object Date]'→ false -
Object.prototype.toString.call(null) === '[object Null]'→ false
检查原型是否为 Object.prototype 或 null
纯对象的原型应直接指向 Object.prototype(或 null,如 Object.create(null)):
-
Object.getPrototypeOf({}) === Object.prototype→ true -
Object.getPrototypeOf(Object.create(null)) === null→ true -
Object.getPrototypeOf([]) === Array.prototype→ false
排除非对象类型和特殊对象
需先确保值是对象(typeof obj === 'object' 且不为 null),再排除常见“伪对象”:
-
null:虽然typeof null === 'object',但它不是对象 -
Array、Function、Date、RegExp、Error等:它们的toString结果不是[object Object] - 自定义类实例:
new MyClass()的 constructor 通常不是Object
推荐的综合判断函数
结合以上逻辑,可封装一个简洁可靠的判断函数:
function isPlainObject(obj) {
if (typeof obj !== 'object' || obj === null) return false;
const proto = Object.getPrototypeOf(obj);
return proto === Object.prototype || proto === null;
}
注意:该函数比仅依赖 obj.constructor === Object 更健壮,因为 constructor 可被修改,而原型不可伪造。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











