最准确的方式是用Array.isArray(),它是ES5标准定义的唯一专用于数组检测的官方方法,语义明确、行为稳定、不受执行环境影响,直接检查对象内部[[Class]]标签,能正确识别跨iframe或跨Realm的数组。

最准确的方式是用 Array.isArray(),它是 ECMAScript 5 标准定义的唯一专用于数组检测的官方方法,语义明确、行为稳定、不受执行环境影响。
为什么 Array.isArray 是首选
它不依赖原型链或构造函数引用,而是直接读取对象内部的 [[Class]] 标签,因此能正确识别跨 iframe、跨窗口甚至跨 Realm 的数组实例。比如一个在 iframe 中创建的数组传入主页面,Array.isArray() 仍返回 true,而其他方法可能失败。
- 写法简洁:
Array.isArray(arr) - 返回布尔值,无歧义
- 现代浏览器和 Node.js 环境已全面支持(IE9+)
兼容老环境的后备方案:Object.prototype.toString.call()
若需支持 IE6–8,可用 Object.prototype.toString.call() 模拟实现。它同样基于内部 [[Class]],可靠性仅次于 Array.isArray()。
- 写法:
Object.prototype.toString.call(arr) === '[object Array]' - 常被用作 polyfill:
if (!Array.isArray) { Array.isArray = function(x) { return Object.prototype.toString.call(x) === '[object Array]'; } } - 额外好处:同一套逻辑还能判断 Date、RegExp、Function 等类型
慎用的方法及其风险
instanceof Array 和 arr.constructor === Array 表面看起来直观,但实际有明显缺陷:
- 跨 iframe 时失效:不同窗口的
Array构造函数不是同一个引用 - 构造函数可被篡改:
arr.constructor = String会让判断彻底失准 - 无法识别通过
Object.create(Array.prototype)创建的对象
绝对不能用 typeof
typeof [] 返回 "object",和普通对象、null 一样。它根本区分不了数组和其他引用类型,属于常见误区。
- 不要写:
typeof arr === 'array'(语法错误) - 也不要写:
typeof arr === 'object'(结果恒为 true,毫无意义)











