apply可将类数组自动解构为独立参数传入函数,只需其具备length属性和数字索引;不支持纯对象,老环境需用slice.call或array.from转真数组。

JavaScript 中用 apply 将类数组(如 arguments、NodeList、HTMLCollection)作为参数列表传给普通函数,本质是让函数接收“多个独立参数”,而非一个数组或类数组对象本身。
apply 的作用就是解构类数组并逐个传参
func.apply(thisArg, arrayLike) 会把 arrayLike 的每个索引项(从 0 开始,直到 length - 1)当作独立参数依次传给 func。它不要求 arrayLike 是真正的 Array,只要具备 length 属性和数字键(如 0、1…)即可。
- ✅ 支持:
arguments、document.querySelectorAll('div')、Array.prototype.slice.call(...)返回的伪数组 - ❌ 不支持:纯对象
{0: 'a', 1: 'b', length: 2}(除非手动挂载到数组原型链或用Array.from转换)
常见类数组直接传给 apply 的写法
无需额外“解构”操作,直接传入即可 —— apply 内部自动按索引展开:
function sum(a, b, c) {
return a + b + c;
}
<p>const args = [1, 2, 3]; // 真数组 → 可用
const nodeList = document.querySelectorAll('input'); // 类数组 → 同样可用(只要 length 和索引存在)</p><p>// ✅ 正确:直接传类数组,apply 自动“解包”
sum.apply(null, args); // → 6
sum.apply(null, nodeList); // 若 nodeList 有 3 个元素且值可转数字,也等效于 sum(1st, 2nd, 3rd)</p><p>// ❌ 错误:不加 apply,直接传整个类数组当第一个参数
sum(nodeList); // → NaN(因为 a = nodeList, b = undefined, c = undefined)
</p>
兼容老环境时的注意事项
某些宿主类数组(如 IE8 的 arguments 或部分 NodeList)可能不完全满足 apply 要求。稳妥做法是先转为真数组:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 用
Array.prototype.slice.call(arrayLike)(ES5 兼容) - 用
Array.from(arrayLike)(ES6+,更语义化,且能处理Map/Set等) - 用扩展运算符
[...arrayLike](ES6+,但不能用于旧版 NodeList)
例如:
// 安全写法(兼容性最强) sum.apply(null, Array.prototype.slice.call(arguments)); <p>// 现代写法(推荐在支持环境下) sum(...Array.from(arguments)); // 注意:这里用扩展符,不是 apply </p>
替代方案:用扩展运算符更直观(但非 apply)
ES6 起,对真数组或可迭代对象,func(...arrayLike) 是更简洁的“解构调用”方式,但注意:它要求 arrayLike 必须是可迭代对象(iterable),而老式 NodeList 或 arguments(ES5)默认不是。
-
[...arguments]✅(arguments在 ES6+ 是可迭代的) -
[...document.querySelectorAll('div')]✅(现代浏览器 NodeList 是可迭代的) -
[...HTMLCollection]❌(仍不可迭代,需先Array.from)
所以,若必须用 apply(比如动态指定 this),就坚持传类数组;若只是解构传参且不关心 this,优先考虑 ... + Array.from 组合。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










