JavaScript Array.isArray()
详解笔记
核心结论
Array.isArray()
是 Array
构造函数的静态方法,必须通过 Array.isArray()
调用,而不是数组实例的方法。
1. 为什么不能是实例方法?
逻辑矛盾
const arr = [1, 2, 3];
const obj = {};
// 如果 isArray 是实例方法
arr.isArray() // 返回 true ✓
obj.isArray() // 报错:TypeError: obj.isArray is not a function ✗
// 静态方法方式(正确方式)
Array.isArray(arr) // true ✓
Array.isArray(obj) // false ✓
设计原则
- 类型检查工具应该从外部视角审视值
- 静态方法属于构造函数本身,不依赖于具体实例
- 类似的设计:
Object.keys()
,Number.isNaN()
,Promise.all()
2. JavaScript 现实 vs TypeScript 类型
JavaScript 运行时
typeof Array // "function"
Array.isArray // ƒ isArray() { [native code] }
// Array 是真实存在的全局构造函数对象
TypeScript 类型定义
// Array 接口 - 描述数组实例
interface Array<T> {
length: number;
push(...items: T[]): number;
pop(): T | undefined;
// 实例方法...
}
// ArrayConstructor 接口 - 描述构造函数静态方法
interface ArrayConstructor {
isArray(arg: any): arg is any[];
from(arrayLike: any): any[];
// 静态方法...
}
declare var Array: ArrayConstructor;
关键区分:
Array<T>
接口 → 数组实例的方法属性ArrayConstructor
接口 →Array
构造函数的静态方法
3. 类似的静态方法模式
静态方法 | 作用 | 为什么不是实例方法 |
---|---|---|
Array.isArray() |
检查是否为数组 | 非数组对象无法调用实例方法 |
Object.keys() |
获取对象所有键 | 需要从外部检查任意对象 |
Number.isNaN() |
检查是否为NaN | NaN 是原始值,没有方法 |
Promise.all() |
处理多个Promise | 方法作用于多个Promise实例 |
4. 正确用法示例
// 检查各种值类型
console.log(Array.isArray([1, 2, 3])); // true
console.log(Array.isArray([])); // true
console.log(Array.isArray({})); // false
console.log(Array.isArray('hello')); // false
console.log(Array.isArray(null)); // false
// 在实际编程中的应用
function processInput(input) {
if (Array.isArray(input)) {
// 处理数组逻辑
return input.map(item => item * 2);
} else {
// 处理非数组逻辑
return [input];
}
}
记忆要点
Array
是真实的构造函数对象,不是纯接口isArray
是静态方法,属于Array
函数本身- 类型检查工具通常设计为静态方法
- TypeScript 接口只是对 JavaScript 现实的类型描述
这样设计保证了 Array.isArray()
可以安全地检查任何值,包括 null
、undefined
和非数组对象。