伪数组是具有length和索引属性但无数组方法的对象,如arguments、nodelist;因非array实例,不能直接调用slice等方法,需用array.prototype.slice.call借用;es6推荐使用扩展运算符或array.from转换。

在 JavaScript 中,伪数组(类数组对象)是指具有 length 属性和若干索引属性(如 0、1),但**没有数组原型方法**(如 slice、map、forEach)的对象。常见例子有:arguments、NodeList(如 document.querySelectorAll() 返回值)、HTMLCollection 等。
为什么不能直接调用 slice?
因为伪数组不是 Array 实例,它不继承 Array.prototype 上的方法。直接写 args.slice(1) 会报错:TypeError: args.slice is not a function。
借用 slice 把伪数组转成真数组
核心思路是:用 Array.prototype.slice 这个函数,通过 .call() 或 .apply() 改变其内部 this 指向,让它把当前伪数组当作“要切片的数组”来处理。
最常用写法:
Array.prototype.slice.call(伪数组, 开始索引)
例如:
// arguments 转数组并去掉第一个参数
function sum() {
const args = Array.prototype.slice.call(arguments, 1); // 从第2个参数开始取
return args.reduce((a, b) => a + b, 0);
}
sum(10, 2, 3, 4); // → 9
更现代、更推荐的替代方式
ES6+ 提供了更简洁、语义更清晰的方案,无需手动借用原型方法:
-
扩展运算符(…):适用于可迭代对象(
arguments、NodeList都是)const arr = [...pseudoArray]; -
Array.from():专为类数组/可迭代对象设计,支持映射回调
const arr = Array.from(pseudoArray);const nums = Array.from(nodeList, el => el.textContent); -
Array.prototype.slice.call 的简写(非标准但常见):
const arr = [].slice.call(pseudoArray);—— 利用字面量数组实例访问原型方法,本质相同但更短
注意事项
不是所有伪数组都完全兼容 slice 借用:
-
HTMLCollection(如document.getElementsByTagName())在某些旧浏览器中可能不支持被slice正确处理,建议优先用Array.from; -
arguments在严格模式或箭头函数中不可用,现代代码应避免依赖它; - 若伪数组缺少
length或索引不连续,slice可能返回空数组或行为异常,此时Array.from更健壮。











