总结
Array.isArray(obj)
✅ 推荐obj instanceof Array
Object.prototype.toString.call(obj) === '[object Array]'
Array.prototype.isPrototypeOf(obj)
方法对比
方法 | 是否推荐 | 说明 |
---|---|---|
Array.isArray(obj) |
✅ 强烈推荐 | 最直接、最准确的方式 |
obj instanceof Array |
✅ 推荐 | 适用于单一全局环境,跨框架可能出错 |
Object.prototype.toString.call(obj) |
✅ 推荐 | 可靠的通用方法,适用于所有对象类型判断 |
Array.prototype.isPrototypeOf(obj) |
❌ 不推荐 | 判断的是原型链,不能准确判断是否为数组实例 |
示例代码
1. Array.isArray()
js
const arr = [1, 2, 3];
console.log(Array.isArray(arr)); // true
const obj = {};
console.log(Array.isArray(obj)); // false
2. instanceof Array
js
const arr = [1, 2, 3];
console.log(arr instanceof Array); // true
const obj = {};
console.log(obj instanceof Array); // false
⚠️ 注意:
instanceof
在跨框架(如 iframe)时可能返回false
。
3. Object.prototype.toString.call()
js
const arr = [1, 2, 3];
console.log(Object.prototype.toString.call(arr)); // [object Array]
const obj = {};
console.log(Object.prototype.toString.call(obj)); // [object Object]
这是最通用、最安全的类型判断方式,适用于任何 JavaScript 环境。
4. Array.prototype.isPrototypeOf()
js
const arr = [1, 2, 3];
console.log(Array.prototype.isPrototypeOf(arr)); // true
const obj = {};
console.log(Array.prototype.isPrototypeOf(obj)); // false
⚠️ 此方法判断的是原型链关系,并非是否为数组实例,不推荐用于判断数组。
推荐用法
- ✅ 优先使用
Array.isArray()
:简洁、准确、标准。 - ✅ 次选
Object.prototype.toString.call()
:适用于需要兼容旧环境或判断多种类型时。
注意事项
- 避免使用
typeof
判断数组:typeof []
返回"object"
。 - 避免使用
instanceof
在跨全局对象(如多个 window)的场景中使用。