Array.isArray是唯一被官方推荐、语义清晰且行为稳定的数组检测方法,它直接读取对象内部[[Class]]标识,不依赖原型链或构造函数,跨iframe准确,对非数组值均返回false,且现代环境全支持。

直接用 Array.isArray() 就行,这是 ES6(实际是 ES5 就已标准化)中唯一被官方推荐、语义清晰、行为稳定的方法。
为什么 Array.isArray 是最准确的
它不依赖原型链、不看构造函数、不拼字符串,而是直接读取对象内部的 [[Class]] 标识。这意味着:
- 跨 iframe 或多个全局环境时依然准确 —— 比如在子页面创建的数组,父页用
Array.isArray()判断仍返回true - 不受
constructor或prototype被篡改的影响 - 对
null、undefined、普通对象、字符串、数字等都返回false,无歧义 - 不会像
typeof []那样错误地返回"object"
常见误判方法对比
这些方式看似可行,但都有明确缺陷:
-
arr instanceof Array:在多 window/iframe 场景下失效(不同环境的Array构造函数不相等) -
arr.constructor === Array:一旦constructor被改写(如arr.constructor = Object),结果就错 -
Object.prototype.toString.call(arr) === '[object Array]':虽兼容旧环境且准确,但写法冗长、易手误,没必要舍近求远 -
typeof arr === 'object' && arr.length !== undefined:鸭子类型,会把类数组(如arguments、NodeList)甚至有length属性的对象误判为数组
怎么用才稳妥
语法极简,传入任意值即可:
立即学习“Java免费学习笔记(深入)”;
-
Array.isArray([1, 2, 3])→true -
Array.isArray({})→false -
Array.isArray(null)→false -
Array.isArray(document.querySelectorAll('div'))→false(它是NodeList,不是数组)
现代浏览器和 Node.js 环境全部支持,无需 polyfill。如果真要兼容 IE8 及更早版本(已极罕见),再考虑 fallback 到 toString.call 方案。


















