如何判断一个对象是否为纯对象?
判断给定的对象是否为纯 JavaScript 对象的实现方法。该函数通过检查对象的原型来确定其类型。
纯对象指的是基本JavaScript对象,通过”{}”或new Object()创建的对象,有些实现也包括Object.create(null)以兼容无原型对象的特例。核心实现基于原型链检查,确保对象原型直接指向Object.prototype或null。
以下是一个准确、可靠的标准实现方法:
function isPlainObject(obj) {
if (typeof obj !== 'object' || obj === null) {
return false;
}
const proto = Object.getPrototypeOf(obj);
return proto === null || proto === Object.prototype;
}
解析步骤:
- 基础逻辑:
- 检查传入值是否为
null
或非object
类型(非函数、数组或类)。 - 是则返回
false
,例如isPlainObject("test") ⇒ false
。
- 检查传入值是否为
- 原型链检测:
- 使用
Object.getPrototypeOf()
高效获取对象原型。 - 检查原型是否可能为
Object.prototype
(针对空字面量或new object对象)或null
(针对 Object.create(null)创建的对象)。
- 使用
- 真实用例输出:
isPlainObject({})
⇒true
isPlainObject(Object.create(null))
⇒true
isPlainObject(new Date)
⇒false
(原型指向 Date.prototype而非Object)isPlainObject(window)
⇒false
(因浏览器对象原型特殊)isPlainObject([])
⇒false
(数组专属原型)
避免常见错误:
- Object.toString的序列化测试可靠性差(如 typeof null 的问题)。
- constructor判断在跨frames场景易失败。
- 核心逻辑高效清晰,兼容各类内置对象鉴别。