JavaScript中如何区分list和object对象类型?
JavaScript中区分List(数组)与Object数据类型的方案
首先明确前提:JavaScript 标准内置类型中不存在名为 list 的类型,开发者日常提到的「list」通常指数组 Array 类型,以下是准确区分 Array 与普通 Object 的可靠方案:
推荐判断方法
- 方法1:
Array.isArray()(优先级最高,ES5及以上版本支持,兼容性好、判断精度最高,不受执行上下文影响)
示例代码:Array.isArray([]) // 返回 true Array.isArray({}) // 返回 false - 方法2:
Object.prototype.toString.call()(通用类型判断方案,可区分所有内置对象类型)
示例代码:Object.prototype.toString.call([]) === '[object Array]' // 判定为数组 Object.prototype.toString.call({}) === '[object Object]' // 判定为普通对象 - 方法3:
instanceof运算符(仅适用于同上下文场景,跨iframe/多执行上下文场景下会失效,因为不同上下文的Array构造函数不是同一个引用)
示例代码:[] instanceof Array // 返回 true {} instanceof Array // 返回 false
你提供的判断函数分析
你给出的函数核心逻辑是通过判断对象是否支持for...of遍历(即是否为可迭代对象)来区分类型,可覆盖基础场景,但存在两个明显缺陷:
- 逻辑缺陷:所有可迭代对象都会被判定为
list,包括Set、Map、字符串包装对象、Generator实例等,不符合区分数组和普通对象的需求 - 语法缺陷:变量
poss没有声明,执行时会污染全局作用域
原函数代码
function objOrLis(obj) { if (typeof obj == "object") { poss = "object" try { for (let i of obj) { poss = "list" } } catch { poss = "object" } return poss } else { let c = typeof obj return c } }
内容的提问来源于stack exchange,提问作者Kunal Agrawal
相关产品推荐
相关产品推荐

