apply是JavaScript中用于“展开调用”的方法,将数组元素作为独立参数传入函数,常用于Math.max、push、concat等场景,解决函数不接受数组整体参数的问题。

JavaScript 中的 apply 方法在数组处理中不是“绑定”工具,而是“展开调用”的利器——它不改变函数本身,而是让函数立刻执行,并把数组元素逐个转为参数传入。关键在于:它解决的是“如何把一整块数据(数组)喂给一个只认单个参数的函数”这个问题。
把数组当参数列表用:最常用也最实用
很多原生方法(如 Math.max、Math.min、Array.prototype.push)不接受数组作为整体参数,但 apply 能把它“摊开”:
-
找最大值:
Math.max.apply(null, [3, 7, 2])等价于Math.max(3, 7, 2),返回7 -
批量追加元素:
arr1.push.apply(arr1, arr2)把arr2所有项插入到arr1末尾(比循环push更简洁) -
注意:第一个参数通常填
null或Math(因Math方法不依赖this),不影响结果
数组降维:用 concat + apply 一行搞定二维变一维
想把 [[1,2], [3,4], [5]] 变成 [1,2,3,4,5]?不用嵌套循环:
Array.prototype.concat.apply([], [[1,2], [3,4], [5]])- 原理:
concat支持多个数组参数,apply把二维数组拆成[].concat([1,2], [3,4], [5]) - ES6 后可用
[].concat(...arr)替代,但apply在旧环境仍可靠
填补数组缝隙或统一处理稀疏结构
JavaScript 数组允许“空位”(如 ["a",, "b"]),forEach 会跳过它,但有时你需要显式识别或填充:
立即学习“Java免费学习笔记(深入)”;
- 用
in运算符检测空位:1 in ["a",, "b"]返回false,而1 in ["a", undefined, "b"]返回true - 若需将空位转为
undefined值再处理,可配合apply和自定义映射逻辑(例如先用Array.from({length: len}, (_, i) => arr[i])规范化) - 这不是
apply的直接用途,但它常出现在需要统一处理类数组或不规则数组的上下文中
替代 call 处理动态参数数组
当函数参数数量不确定,且来源是数组或 arguments 时,apply 比 call 更自然:
function log(...msgs) { console.log.apply(console, msgs); }-
log("User", "logged in", "at", new Date())→ 完整输出所有内容 - 这里
console.log需要保持this为console,所以第一个参数不能省略;apply直接适配任意长度的msgs


















