Array.isArray()是唯一能跨全局环境准确识别数组的原生方法,因其不依赖构造函数或原型链,而是直接检查内部类型标记,故在iframe、Worker、Node.js多Context等场景下均可靠。

Array.isArray() 是唯一能跨全局执行上下文(如 iframe、不同 window、Worker 环境)准确识别数组的原生方法。
为什么 instanceof 会失效
当数组来自另一个全局环境(比如 iframe 中创建的数组),arr instanceof Array 会返回 false,因为不同全局环境中的 Array 构造函数是彼此独立的对象,原型链不互通。
- iframe 中的
[]的constructor指向的是 iframe 的Array - 主页面的
Array和 iframe 的Array在内存中是两个不同函数 -
instanceof依赖原型链查找,跨环境时查不到主页面的Array.prototype
Array.isArray() 的跨环境可靠性
该方法由 ES5 引入,被设计为“语义化检测”,不依赖构造函数或原型链,而是直接检查内部属性 [[Class]] 或等效的类型标记(现代引擎用更高效的内部标识)。无论数组来自哪个全局对象,只要它是规范定义的 Array 实例,就返回 true。
- 支持 iframe、
new Worker()、eval产生的不同上下文 - 在 Node.js 多个 vm.Context 之间也有效
- 对稀疏数组、带自定义属性的数组、冻结/封印数组同样准确
实际使用建议
始终优先用 Array.isArray() 判定数组,尤其在处理外部传入数据、跨 frame 通信、插件系统或序列化反序列化场景中。
- 避免写
obj.constructor === Array或obj instanceof Array - 不要依赖
Object.prototype.toString.call(obj) === '[object Array]'—— 虽然它也能跨环境,但比Array.isArray()更慢且冗长 - 注意:
Array.isArray()对null、undefined、原始值均安全返回false,无需额外空值防护
兼容性补充说明
IE8 及更早版本不支持 Array.isArray()。若需兼容,可添加轻量 polyfill:
if (!Array.isArray) {
Array.isArray = function(arg) {
return Object.prototype.toString.call(arg) === '[object Array]';
};
}该 polyfill 利用 toString 的跨环境一致性,效果等同原生方法,且无副作用。










