Parameters(形参) 和 Arguments(实参) 一样吗?
Javascript是一种函数式语言,这意味着函数是主要的执行模块单元。显然,JavaScript中的函数非常重要。当讨论函数时,术语 parameters(形式参数,简称形参) 和 arguments(实际参数,简称实参) 通常可以混用,就好像它们是一样的,但其实有一个非常微妙的区别。
- Parameters(形参) 是函数定义时的形式参数,作为函数定义的一部分,是列出类的变量。
- Arguments(实参) 是函数调用时的实际参数,是在函数被调用时传递给该函数的变量值。
我们为什么要为这个微小的差异而烦恼呢?
首先,如果函数调用期间传递的 arguments(实参) 数量和函数定义中列出的 parameters(形参) 数量不同,JavaScript 不会抛出错误。我们应该清楚的是, parameters(形参) 和 arguments(实参) 应该被视为两个不同的实体来对待。
// 带有3个parameters(形参)的基本函数,打印所有参数的和 function argCheck(paramter1, parameter2, parameter3){ console.log(parameter1 + parameter2 + parameter3); } // 多 1 个 arguments(实参) 调用 argCheck(1,2,3,4); // 打印 6 (1 + 2 + 3, 忽略 4) // 少 1 个 arguments(实参) 调用 argCheck(1,2); // 打印 NaN ,因为默认情况下,如果缺少相应的 arguments(实参) ,那么它将被设置为 undefined 。 // parameter3 被分配为 undefined ,所以 1+2+undefined = NaN // 特别注意,这里不会抛出错误
在上面的代码片段中,函数 argCheck
根据其函数定义获取三个参数。在第7行中,我们使用 1 个额外的 arguments(实参) 调用函数,代码执行时没有抛出任何错误。类似地,在第11行中,我们用比 parameters(形参) 少一个的 arguments(实参) 调用函数,它仍然不会引发任何错误。希望这已经使你确信,arguments(实参) 和 parameters(形参) 还有更多的内容,本文将讨论 JavaScript 在上下文环境中提供的一些特性。
基本上,当提供多余 arguments(实参) 时,它们不会被分配给任何 parameters(形参)。有一些方法可以访问这些多余的分配,我们将会在后面稍微的讲一下。另一方面,如果我们的 parameters(形参) 比 arguments(实参) 多,没有相应 arguments(实参) 的 parameters(形参) 将被设置为 undefined
。让我们逐个探究一下与 arguments(实参) 和 parameters(形参) 相关的一些 JS 特性。
arguments 形参
不,这不是打字错误。 arguments
形参基本上是传递给函数的所有参数的集合。该参数隐式地传递,就像 this
形参一样。arguments
形参是一个类似数组的构造,即使没有显式定义的 parameters(形参) ,它也可以用于访问传递给函数的 arguments(实参)。
function argumentVar(parameter1, parameter2, parameter3){ console.log(arguments.length); // 打印传递的 arguments(实参) 数量。 console.log(arguments[3]); // 打印第4个 arguments(实参) 。遵循数组索引计数 } argumentVar(1,2,3,4,5); // 顺序打印结果 // 5 // 4 // 5 是 arguments(实参) 的数量 // 4 是第 4 个 arguments(实参)
请参阅上面使用 arguments
形参的代码片段。 arguments.length
表示 arguments(实参) 的确切数量,这并不取决于函数定义中 parameters(形参) 的数量。可以使用类似于数组的索引计数来访问各个参数。
arguments
对象的一个有趣的特性是它在非严格模式下将函数 parameters(形参) 设为别名。 这意味着更改 arguments[0]
会更改 parameter1
。
Rest Parameters(剩余形参)
Rest 剩余形参是 ES6 添加到 JavaScript 的一个新特性。函数定义时,在最后一个形参前添加省略号(…)前缀。
function restParam(...restArgs){ console.log(restArgs.length); // 打印传递的 arguments(实参) 数量。 console.log(restArgs[3]); // 打印第4个 arguments(实参) } restParam(1,2,3,4,5); // 顺序打印结果 // 5 // 4 // 5 是 arguments(实参) 的数量 // 4 是第 4 个 arguments(实参)
在上面的代码片段中,…restArgs
创建一个数组 restArgs
,它会在这个数组中保存传递给函数的所有 arguments(实参) 。Rest Parameters (剩余形参) 必须是最后一个 parameters(形参) ,否则会引发语法错误:Syntax error : parameter after rest parameter
。
arguments
对象和 rest parameters
(剩余形参)之间有两个主要区别:
Rest Parameters
(剩余形参) 是一个真正的数组,可以应用forEach
和sort
等数组方法。尽管arguments
对象有length
方法,但它不是一个真正的数组,不能使用sort
这样的数组方法。Rest Parameters
(剩余形参) 只包含没有相应形参的实参,而arguments
对象包含传递给函数的所有参数。 代码段 #3 也可以写成如下形式:
function restParam(parameter1, ...restArgs){ console.log(restArgs.length); // 打印没有相应 Parameters(形参)的 Arguments(实参)数量 console.log(restArgs[2]); // 打印没有相应 Parameters(形参)的第三个 Arguments(实参) } restParam(1,2,3,4,5); // 顺序打印结果 // 4 // 4 // 4 是没有相应 Parameters(形参)的 Arguments(实参)数量 // 4 没有相应 Parameters(形参)的第三个 Arguments(实参)值
希望本文有助于你了解有关 Arguments(实参) 和 Parameters(形参) 的一些信息,以及为什么要区分两者的重要性。如果您有任何问题或希望我详细说明,请留言。
一直不知道javascript的实参形参还有这种操作的