Lodash源码阅读-isArrayLike

135 阅读2分钟

功能概述

isArrayLike 函数用于判断一个值是否为类数组对象的工具函数。它通过检查值的 length 属性特征来识别类数组对象,是数组相关操作中的重要基础函数。类数组对象包括数组、arguments 对象、DOM NodeList 等具有 length 属性且非函数的对象。

前置学习

在深入理解 isArrayLike 之前,建议先了解以下相关函数:

  • isLength:检查一个值是否为有效的数组长度(非负整数且不超过安全整数范围)
  • isFunction:检查一个值是否为函数类型

此外,对以下概念的理解也会有所帮助:

  • 类数组对象:具有 length 属性和索引元素的对象,但不是真正的数组
  • JavaScript 中的安全整数:了解 Number.MAX_SAFE_INTEGER 的概念
  • DOM 集合对象:如 NodeList、HTMLCollection 等,它们都是类数组对象

isArrayLike 是许多数组操作函数的基础,理解它对于掌握 Lodash 的数组操作至关重要。

源码实现

function isArrayLike(value) {
  return value != null && isLength(value.length) && !isFunction(value);
}

实现原理解析

1. value != null

类数组对象必须存在且非空值,排除 null 和 undefined 类型。

isArrayLike(null); // false(排除 null)
isArrayLike(undefined); // false(排除 undefined)

2. isLength(value.length)

类数组对象的 length 属性需为有效整数(≥0 且 ≤ Number.MAX_SAFE_INTEGER),用于表示元素数量或索引范围。

isArrayLike("abc"); // true(字符串 length=3,符合整数条件)
isArrayLike([1, 2, 3]); // true(数组 length=3,符合条件)
isArrayLike({ length: 3.5 }); // false(非整数)
isArrayLike({ length: Number.MAX_SAFE_INTEGER + 1 }); // false(超出安全范围)

3. !isFunction(value)

排除函数类型(如 Function、GeneratorFunction 等),因函数虽有 length 属性但用途不同,函数 length 属性表示参数个数,而非类数组的元素数量。

isArrayLike(function () {}); // false(函数被排除)
isArrayLike(async function () {}); // false(异步函数同样被排除)

总结

仅当值存在、length 合法且非函数时,才视为类数组,避免逻辑错误。