HOWTO · JavaScript

将数组传递给 JavaScript 中的函数

了解何时将数组作为单个参数传递、何时使用 apply() 或扩展语法将其元素展开为单独的参数,以及如何通过 arguments 对象读取接收到的值。

本页内容

将数组传给 JavaScript 函数时,先确定函数应将数组作为一个值接收,还是将数组元素作为独立的位置参数接收。如果函数需要一个数组参数,就直接传入数组;如果需要多个独立参数,可使用 apply() 或 spread 语法;在普通函数中,也可以从 arguments[0] 读取传入的数组。这些方式适用于不同的函数签名。

下面的示例都是独立的 JavaScript 代码片段。apply()、spread 和 arguments 示例展示了实际输出。

使用 apply() 将数组元素作为函数参数传入

Function.prototype.apply() 会在指定的 this 值下调用函数,并将数组或类数组对象中的条目作为位置参数传入。第一个参数是 this 值,第二个参数是参数列表。它不会返回 arguments 对象;apply() 返回的是函数自身的返回值。如果需要在提供参数列表的同时指定 this,可以使用这种方式。

此示例将数组中的每个元素传给对应的参数。标签由选定的 this 值提供。

const names = ['Mehvish', 'John', 'Henry', 'Thomas'];

function displayName(first, second, third, fourth) {
  console.log(`${this.label}: ${first}, ${second}, ${third}, ${fourth}`);
}

displayName.apply({ label: 'Names' }, names);
Names: Mehvish, John, Henry, Thomas

如果函数需要将数组作为一个参数接收,就声明一个参数并直接传入 names。函数收到的单个值就是整个数组:

const names = ['Mehvish', 'John', 'Henry', 'Thomas'];

function displayName(names) {
  console.log(names.join(', '));
}

displayName(names);

这与上面的四参数 displayName 函数签名不同:直接传入时,函数收到一个数组参数;使用 apply() 时,数组中的四个元素会作为四个独立参数传入。spread 语法也会在调用位置展开数组元素。

使用 Spread 语法将数组元素作为函数参数传入

spread 语法(...)会在函数调用时将数组等可迭代对象展开为单独的值。每个值会按顺序对应一个位置参数。如果函数需要多个独立参数,而你不需要用 apply() 指定 this 值,就可以使用这种语法。

const names = ['Mehvish', 'John', 'Henry', 'Thomas'];

function displayName(first, second, third, fourth) {
  console.log(`${first}, ${second}, ${third}, ${fourth}`);
}

displayName(...names);
Mehvish, John, Henry, Thomas

在这里,displayName 收到四个字符串参数。相比之下,displayName(names) 只传入一个参数,其值是整个数组。函数声明的参数和调用表达式应与函数需要的数据形式相匹配。spread 表达式在调用位置展开数据,因此函数仍可使用普通的命名参数。

使用 arguments 对象读取函数参数

普通函数内部可以使用 arguments 对象,其中包含本次调用传入的值。它具有类数组特征,包括 length 属性和按索引访问的条目,但它本身不是 Array,也不具备 Array 的所有方法。箭头函数不会定义自己的 arguments 对象,因此这种写法需要使用普通函数。

如果调用函数时只传入一个数组,该数组位于 arguments[0],而 arguments.length 的值为 1。函数随后可以检查或遍历该索引处的数组。arguments 用于描述函数收到的值,并不是传递数组的方式。

const names = ['Mehvish', 'John', 'Henry', 'Thomas'];

function inspectArguments() {
  console.log(arguments.length);
  console.log(arguments[0].join(', '));
}

inspectArguments(names);
1
Mehvish, John, Henry, Thomas

若要复制类数组集合 arguments,以便使用数组方法,可以调用 Array.from(arguments)。对于输入项明确的现代函数,使用命名参数或剩余参数通常更清晰。如果函数需要整个数组作为一个集合,就直接传入数组;如果需要数组中的各项作为独立参数,则选择 apply() 或 spread 语法。