判断一个对象为数组
2025年5月11日大约 2 分钟
判断一个对象为数组
方式一
通过原型链上的 toString 方法
function isArray(obj) {
return Object.prototype.toString.call(obj) === "[object Array]";
}这种方式是不安全的,有方式绕过这种方式
const obj = {
value: "100",
[Symbol.toStringTag]: "abc",
};
console.log(Object.prototype.toString.call(obj));方式二
function isArrayByInstanceof(obj) {
//instanceof 判断不安全 伪数组识别不出
return obj instanceof Array;
}以下会识别出定义的 LikeArray 为数组
function likeArray() {}
likeArray.prototype = Object.create(Array.prototype);
const obj2 = new likeArray();
obj2[0] = "a";
obj2[1] = "b";
log(obj2 instanceof Array);方式三
function isArrayByClass(obj) {
return obj.constructor === Array;
}与 instanceOf 一样可以通过修改原型链绕过验证
方法四
function isArrayByArray(obj) {
return Array.isArray(obj);
}Array.isArray是ES6的一个新特性可以准确识别数组对象
背景
「判断一个对象为数组」属于语言语义边界主题。该类问题在重构阶段最容易引发“代码没报错但行为变了”的隐性风险。
核心原理
需要同时理解语法定义与运行时行为:作用域、提升规则、this 绑定、短路语义、类型判定边界。
实现方式 / 示例
建议每个结论都配“正例 + 反例 + 适用边界”,并明确推荐写法与禁用写法。
常见问题
- 只背结论,不验证边界。
- 在不同场景复用同一写法,忽略语义差异。
- 未约定判定优先级(如优先使用 Array.isArray)时,历史代码会混用多种方案,抬高维护成本。
最佳实践
将知识点同步到 ESLint 规则、代码评审清单与模板代码,形成自动化约束。
总结
围绕「判断一个对象为数组」的关键不是记忆语法,而是把语义边界沉淀为可执行规范。
