JavaScript如何通过变量原型获取布尔值区分普通对象与数组
实现方案
首先说明:数组本质是 Object 的子类实例,直接使用 instanceof Object 判断会同时命中数组和普通对象,无法区分二者,以下是符合需求的校验写法:
方案1:使用原型对比(和你测试代码的逻辑完全匹配)
直接判断变量的原型是否等于Object的原型即可:
// 校验函数 function checkIsObject(val) { return Object.getPrototypeOf(val) === Object.prototype } // 测试效果 checkIsObject({a: '1'}) // 返回 true checkIsObject([1,2,3]) // 返回 false
如果需要兼容null、undefined等边界场景,可以补充前置判断:
function checkIsObject(val) { return val != null && typeof val === 'object' && Object.getPrototypeOf(val) === Object.prototype }
方案2:使用toString标签判断(兼容性最好,无跨上下文问题)
调用Object原型上的toString方法,可以准确获取变量的内置类型标签:
function checkIsObject(val) { return Object.prototype.toString.call(val) === '[object Object]' }
数组调用该方法会返回[object Array],可以直接和普通对象区分开。
方案3:组合条件判断
先排除数组类型,再判断是否为对象类型:
function checkIsObject(val) { return typeof val === 'object' && val !== null && !Array.isArray(val) }
条件判断使用示例
你可以直接在if语句中使用上述逻辑:
const target = [1,2,3] // 直接内联判断 if (Object.prototype.toString.call(target) === '[object Object]') { // 是普通对象,执行对应逻辑 } else { // 是数组/其他类型,执行对应逻辑 }
内容的提问来源于stack exchange,提问作者Vikas Acharya
相关产品推荐
相关产品推荐

