如何判断一个对象是否为纯对象?

判断给定的对象是否为纯 JavaScript 对象的实现方法。该函数通过检查对象的原型来确定其类型。

JavaScript 中等 对象检测 JS 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;
}

解析步骤:

  1. 基础逻辑
    • 检查传入值是否为null或非object类型(非函数、数组或类)。
    • 是则返回false,例如 isPlainObject("test") ⇒ false
  2. 原型链检测
    • 使用 Object.getPrototypeOf() 高效获取对象原型。
    • 检查原型是否可能为Object.prototype(针对空字面量或new object对象)或null(针对 Object.create(null)创建的对象)。
  3. 真实用例输出
    • 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场景易失败。
  • 核心逻辑高效清晰,兼容各类内置对象鉴别。