JavaScript中区分数组与对象最可靠的方法是Array.isArray();instanceof Array在多全局环境易失效;Object.prototype.toString.call()可通用识别类型;length属性不可靠。

JavaScript 里数组和普通对象都是 typeof 返回 "object" 的引用类型,单靠 typeof 完全无法区分。必须用更精准的方法识别它们的本质差异。
用 Array.isArray() 最可靠
这是 ECMAScript 5.1 引入的官方标准方法,专为判断数组设计,跨 iframe、跨 window 也稳定有效:
-
Array.isArray([])→ true -
Array.isArray({})→ false -
Array.isArray(new Set())→ false -
Array.isArray(null)→ false(不会报错)
避免用 instanceof Array
它依赖原型链,在多全局环境(如 iframe、Web Worker)中容易失效:
- 主页面创建的数组,在 iframe 中执行
arr instanceof Array可能返回 false -
[] instanceof Object却总是 true,说明它只是普通对象的子类,不能反向用来确认“是不是数组”
Object.prototype.toString.call() 是通用后备方案
所有内置类型都可通过该方法获得规范字符串标签,适合需要统一处理多种类型的场景:
立即学习“Java免费学习笔记(深入)”;
-
Object.prototype.toString.call([])→ "[object Array]" -
Object.prototype.toString.call({})→ "[object Object]" -
Object.prototype.toString.call(new Date())→ "[object Date]" - 注意:需严格比对完整字符串,不能只看是否含
Array
别依赖 length 属性或 hasOwnProperty("length")
这看似直观,但不可靠:
- 普通对象可以手动添加
length属性:{ length: 3 }也会有length - 稀疏数组或设置了
length的对象容易造成误判 -
hasOwnProperty("length")对Object.create(null)创建的对象也不适用


















