小熊奶糖(BearCandy)
小熊奶糖(BearCandy)
发布于 2025-10-05 / 1 阅读
0
0

JavaScript `Array.isArray()` 详解笔记

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];
  }
}

记忆要点

  1. Array 是真实的构造函数对象,不是纯接口
  2. isArray 是静态方法,属于 Array 函数本身
  3. 类型检查工具通常设计为静态方法
  4. TypeScript 接口只是对 JavaScript 现实的类型描述

这样设计保证了 Array.isArray() 可以安全地检查任何值,包括 nullundefined 和非数组对象。


评论