登录
首页 >  文章 >  前端

判断JS对象是否为普通对象的几种方法

时间:2026-04-15 16:40:36 439浏览 收藏

本文深入解析了如何准确判断JavaScript中一个对象是否为“普通对象”——即纯粹的键值对集合(如{}、new Object()创建的对象),而非数组、日期、正则、函数等内置类型或自定义类实例;核心推荐方案是结合typeof检查与Object.prototype.toString.call()双重验证,既规避了constructor被篡改或原型链污染的风险,又具备出色的跨环境兼容性,文中还提供了简洁可靠的isPlainObject实现,并贴心提示了Object.create(null)这类无原型对象的特殊处理场景,是前端开发中处理对象类型校验的实用指南。

JavaScript中判断一个对象是否为普通对象的可靠函数

判断一个对象是否为“普通对象”(即通过 {}new Object()Object.create({}) 等方式创建的纯粹键值对集合,而非 ArrayDateRegExpFunctionMapSet 等内置对象或自定义类实例),最可靠的方式是结合 Object.prototype.toString.call() 与构造函数检查。

使用 Object.prototype.toString.call() 判断内部 [[Class]]

这是最稳定、跨框架兼容的方法,不受原型链污染或 constructor 被篡改的影响:

  • Object.prototype.toString.call(obj) 返回形如 "[object Object]" 的字符串
  • 对普通对象,结果严格等于 "[object Object]"
  • 对数组返回 "[object Array]",日期返回 "[object Date]",等等

排除 null 和非对象类型

必须先确保参数是对象类型且不为 null,否则 toString.call(null) 会返回 "[object Null]",而 toString.call(123)"[object Number]"

  • typeof obj === 'object' 排除原始值(注意:null 也满足该条件)
  • 显式加上 obj !== null

完整可靠的判断函数

综合以上两点,可写出如下函数:

function isPlainObject(obj) {
  return (
    typeof obj === 'object' &&
    obj !== null &&
    Object.prototype.toString.call(obj) === '[object Object]'
  );
}

该函数能正确识别:

  • {}new Object()Object.assign({}, ...)true
  • Arraynew Date()/abc/new Map()function(){}nullundefined123'str'false

注意:它不认为 Object.create(null) 是普通对象(因其内部 [[Prototype]] 为 null,但 toString 仍返回 "[object Object]")。若业务中需包含此类“无原型对象”,需额外判断 Object.getPrototypeOf(obj) === null 并按需合并逻辑。

到这里,我们也就讲完了《判断JS对象是否为普通对象的几种方法》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>