JavaScript中可用Array.prototype.slice.apply(伪数组)将伪数组转为真数组,因slice只依赖length属性和数字索引,伪数组恰好满足;apply将其展开为参数列表供slice读取。

JavaScript 中用 apply 将伪数组(如 arguments、NodeList)转为真实数组,核心是借 Array.prototype.slice 的方法,并用 apply 把伪数组作为参数列表传入。
为什么能用 slice + apply?
Array.prototype.slice 本不依赖 this 是否为真数组——它只关心目标对象是否有 length 属性和数字索引。伪数组恰好满足这点,所以可被“骗过”。apply 则把伪数组展开成参数,让 slice 从索引 0 开始逐个读取。
标准写法(兼容老浏览器)
最常用且安全的方式:
Array.prototype.slice.apply(伪数组)- 等价于
[].slice.apply(伪数组)(更简洁,原理相同)
例如:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
立即学习“Java免费学习笔记(深入)”;
function foo() {
var realArray = Array.prototype.slice.apply(arguments);
console.log(Array.isArray(realArray)); // true
}注意边界情况
某些伪数组(如 IE8- 的 NodeList)可能不完全支持 length 或索引访问,导致转换后缺项或报错。稳妥做法是先检测:
- 检查
typeof 伪数组 === 'object'且有length属性 - 确保
length是非负整数,再调用slice - 对老旧环境,可降级为循环手动推入:
for (var i = 0; i
现代替代方案(推荐优先使用)
ES6+ 提供更直接、语义清晰的方法:
-
Array.from(伪数组)—— 支持映射、类型检查,自动处理空值 -
[...伪数组](扩展运算符)—— 简洁,但要求伪数组可迭代(NodeList在现代浏览器中已实现[Symbol.iterator])
若需兼容性与可读性兼顾,Array.from 是当前最佳选择;仅需支持较新环境时,扩展运算符最自然。

















