在JavaScript中,Array.isArray() 是判断变量是否为数组的最可靠方法。由于 typeof [] 返回 "object",而 instanceof Array 在多窗口或跨 iframe 环境下容易失效,该方法专为跨执行上下文准确识别数组而设计,兼容 IE9 及以上版本,返回布尔值,并能有效区分真正的数组与类数组对象。

在 JavaScript 开发中,判断一个值是否为数组始终是个经典问题。资深开发者几乎会毫不犹豫地推荐Array.isArray()——它无疑是目前最可靠、最直接的数组检测方法,没有之一。
为什么推荐使用 Array.isArray()
过去常用的方案无非两种:typeof 和 instanceof。但两者都存在明显缺陷:
– typeof [] 返回 "object",这基本等于没有区分——对象、数组、null 都返回 object,完全无法辨识;
– arr instanceof Array 看似可行,但一旦涉及 iframe 或多个执行上下文(例如不同 window),各环境的 Array 构造函数并不相等,判断结果就会出错。
Array.isArray() 是 ECMAScript 5 引入的标准方法,从设计之初就专为跨环境、跨上下文精准识别数组而生。兼容性也足够广泛:IE9 及以上版本,所有现代浏览器均已支持,日常开发可放心使用。
基本用法
语法极为简洁:传入任意值,返回布尔值。通过以下例子可以一目了然:
Array.isArray([])→trueArray.isArray([1, 2, 3])→trueArray.isArray({})→falseArray.isArray(null)→falseArray.isArray("hello")→falseArray.isArray(undefined)→false
结果清晰直白,没有任何歧义或误解。
常见误判场景与应对策略
有些对象虽然具备数组的部分特征,例如函数内部的 arguments 对象、DOM 查询返回的 NodeList,它们拥有 length 属性和索引,但并非真正的 Array 实例。使用 Array.isArray() 一测即可现出原形:
function f() { return Array.isArray(arguments); }→falseArray.isArray(document.querySelectorAll("div"))→false
如果需要统一处理类数组对象,可以先通过 Array.isArray() 进行判断,再根据结果决定是否转换为真正的数组。例如使用展开运算符 [...nodeList] 或 Array.from() 将其转为数组,后续操作将更加便捷。
兼容性补充(旧环境支持)
若需要兼容 IE8 及更早期的浏览器,可以添加一个简单的 polyfill:
if (!Array.isArray) {
Array.isArray = function(arg) {
return Object.prototype.toString.call(arg) === "[object Array]";
};
}
这段代码利用 Object.prototype.toString 的内部机制,是业界公认的标准降级方案。不过,目前仍使用 IE8 的项目已极为罕见,日常开发基本无需考虑。
