类数组对象需转为标准数组才能使用数组方法,推荐 Array.from()(ES6标准、语义清晰)或扩展运算符[...](简洁可读),兼容旧环境可用 Array.prototype.slice.call()。

类数组对象不是真正的数组,但有 length 属性和按数字索引存储的元素,比如 arguments、NodeList、HTMLCollection。要使用数组方法(如 map、filter、forEach),必须先转成标准数组。
用 Array.from() 最推荐
这是 ES6 引入的标准化方法,语义清晰、兼容性好(IE 不支持,现代浏览器均支持),还能处理 Map、Set 等可迭代对象。
- 直接转换:
Array.from(nodeList) - 带映射操作:
Array.from(inputs, input => input.value) - 兼容旧环境可配合 polyfill,或用 Babel 转译
用扩展运算符 [...] 最简洁
适用于所有可迭代对象(包括类数组),写法短,可读性强,但不支持 IE 和较老的 Node.js 版本。
const arr = [...document.querySelectorAll('div')];-
const args = [...arguments];(注意:箭头函数无arguments) - 不能用于没有
Symbol.iterator的类数组(如某些旧版 DOM 集合),此时会报错
用 Array.prototype.slice.call() 兼容最广
ES5 时代的经典方案,所有浏览器都支持,原理是借用数组的 slice 方法并绑定 this 到类数组上。
立即学习“Java免费学习笔记(深入)”;
Array.prototype.slice.call(nodelist)- 可简写为
[].slice.call(nodelist),但前者更明确 - 注意:只适用于有
length和数字索引的对象;若length不是整数或为负值,行为可能异常
避免用 Array.prototype.map.call() 单独转换
有人误以为 map 也能“转数组”,其实它要求目标已是数组或类数组,且返回的是新数组——但它本身不解决“是否可调用”的前提问题。
- ✅ 正确用法:
Array.prototype.map.call(nodelist, node => node.tagName)(已确保是类数组) - ❌ 错误假设:
Array.prototype.map.call({0: 'a', length: 1})能“变成数组”——它确实返回数组,但只是副作用,语义不清,不推荐作为转换手段 - 真正需要转换时,优先选
from或[...]


















