判断对象是否为类数组需满足四点:非null/undefined且为object类型;拥有非负整数length属性且小于2^32;可通过数字索引访问元素;array.isarray()返回false。

判断一个对象是不是类数组,关键看它是否满足“形似数组、实非数组”的基本特征——有 length 属性、能用数字索引取值,但调用 Array.isArray() 返回 false。
核心检测条件
一个对象要被认定为类数组,通常需同时满足以下四点:
- 不是
null或undefined,且类型为object - 拥有
length属性,且该属性值为非负整数(isFinite(length) && length >= 0 && Number.isInteger(length)) -
length值小于2^32(即4294967296),这是 JavaScript 数组索引的上限 - 元素可通过数字索引访问(例如
obj[0]、obj[1]存在或可读,不报错)
实用检测函数
可封装一个健壮的判断函数,避免手动重复检查:
function isArrayLike(obj) {
return obj != null
&& typeof obj === 'object'
&& isFinite(obj.length)
&& obj.length >= 0
&& Number.isInteger(obj.length)
&& obj.length
<p>这个函数能准确识别 <code>arguments</code>、<code>NodeList</code>、<code>HTMLCollection</code>,也能排除普通对象(如 <code>{length: 3}</code> 但无索引属性)或假类数组(如 <code>{length: -1}</code> 或 <code>{length: 'abc'}</code>)。</p>
<h3>快速验证技巧(调试时常用)</h3>
<p>在控制台临时验证,不必写函数:</p>
- 查类型:
typeof obj === 'object'且!Array.isArray(obj) - 查长度:
obj.length !== undefined && Number.isInteger(obj.length) - 查索引访问:
obj[0] !== undefined || obj[0] === null || '0' in obj(覆盖null或undefined元素) - 试方法:
typeof obj.forEach === 'undefined'(类数组没有原生数组方法)
常见误判提醒
注意这些“看起来像但实际不算”的情况:
- 字符串有
length和索引,但它是原始类型,typeof 'abc' === 'string',不属于对象范畴 - Map、Set、TypedArray 有
length或size,但结构不同,不满足数字索引连续存储的要求 - 手动构造的
{0: 'a', 2: 'c', length: 3}是类数组;但若缺1索引,仍算——只要length合法、索引可读即可











