在JavaScript中判断元素是否为对象的正确适用方法有哪些?
JavaScript判断对象的常用方案对比
你提到的两种方案的缺陷
1. element.constructor == Object
- 仅对直接通过
{}、new Object()创建的普通对象生效,自定义类的实例、原型被修改过的对象都会判断失败 - 没有
constructor属性的对象(比如Object.create(null)创建的对象)会直接判定为false - 如果
element是null/undefined,访问constructor会直接抛出类型错误
2. typeof element === 'object'
- 存在JS历史遗留Bug:
typeof null返回object,会把null误判为对象 - 数组、
Date、RegExp、Map等内置引用类型的typeof结果也都是object,如果要区分普通对象和其他内置对象,这个判断完全不适用
不同场景下的最优方案
场景1:判断任意引用类型(包括数组、内置对象、函数、自定义类实例都算对象)
function isReferenceType(val) { return val !== null && (typeof val === 'object' || typeof val === 'function') }
适用场景:仅需要排除string/number/boolean/symbol/bigint/undefined/null这些原始类型的情况
场景2:判断纯粹的普通对象(Plain Object,即仅通过{}、new Object()、Object.create(null)创建的对象)
function isPlainObject(val) { if (Object.prototype.toString.call(val) !== '[object Object]') return false const proto = Object.getPrototypeOf(val) return proto === null || proto === Object.prototype }
适用场景:需要排除数组、Date、自定义类实例等非普通对象的场景,是通用性最高的判断方案
内容的提问来源于stack exchange,提问作者sunny
相关产品推荐
相关产品推荐

