前言
在 JavaScript 中,arguments
是一个类数组对象,它包含了函数调用时传入的所有参数。尽管它看起来像数组,但实际上并不是真正的数组,这意味着它不具有数组的所有方法如.push()
、.pop()
等。
JavaScript 的函数参数和其他的语言有些不同,它并不介意你传进来多少个参数,以及参数的数据类。即使你在定义函数时,只设置了两个形参,那么在调用这个函数时,你给他传递一个、两个,或者是其它四个、五个实参,它都能接收,之所以会这样是因为在函数参数内部是用一个数组来表示的,在函数体内是通过 arguments 对象来访问这个参数数组,从而获取传递给函数的每个参数。
arguments 对象只是与数组类似,但他并不是一个数组,可以把它叫做伪数组,你也可以把它叫做其它的都可以。简单记录一下
一. 属性特点
Arguments 的特定属性和特点,请看
- 长度属性:
arguments.length
返回传入函数的实际参数数量。- 索引访问:你可以通过索引(例如
arguments[0]
)来访问各个参数。- 命名参数:如果函数定义中有命名参数,你仍然可以通过
arguments
对象访问它们,即使这些参数没有在函数签名中出现。- 可枚举性:
arguments
对象的元素是可以枚举的,这意味着你可以使用for...in
循环来遍历所有参数。
二. 默认参数
函数的默认参数 arguments,请看
1. 函数的默认参数arguments详细,请看
function fn() {
console.log(arguments);
}
fn()
输出:
可以看到,我们在调用函数时,没有传递任何参数,但是依然可以在函数内部,获取到数组形式的arguments对象。
三. 一个参数
当函数参数只有一个时,请看
1. 当函数参数只有一个,请看
function fn(a){
console.log(a);
console.log(arguments[0]);
}
fn(2)
输出:
可以看到,我们可以通过 arguments[0] 来获取到传递进来的参数实例。
四. 实参大于形参
当我们传递的实参个数大于形参的个数时,请看
function fn(a) {
console.log(a);
console.log(arguments);
console.log(arguments[2]);
}
fn(2, 3, 4)
输出:
可以看到,在我们没有使用形参接收参数时,在函数内部依然可以使用 arguments 来获取到实参数据。arguments 接受到传递过来的所有数据,把他们都给装进了一个数组里,并且可以通过索引拿到相应的值,索引从0开始。
五. 实参小于形参
1. 当我们传递的实参个数小于形参的个数,请看
function fn(a, b) {
console.log(a);
console.log(b);
console.log(arguments[0]);
console.log(arguments[1]);
}
fn(1);
输出:
可以看到,在没有传递实参时,在函数内部使用对应的形参和 arguments 都是undefined。
2. 当我们传递的实参个数小于形参的个数,并且赋值时,赋值的形参值被改变,不会影响 arguments 对象,因为 arguments 对象的大小是由传入的实参的个数决定的,并不是由定义的命名参数的个数决定的,没有传递值的形参将会自动被赋予 undefined值,跟没有定义直接使用一样,举个例子,请看
function fn(a, b) {
b = 7;
console.log(a);
console.log(b);
console.log(arguments[0]);
console.log(arguments[1]);
}
fn(1);
输出:
六. 修改形参
当我们修改形参和 arguments 时,请看
1. 修改形参
function fn(a) {
a = 5;
console.log(a);
console.log(arguments[0]);
}
fn(2, 3, 4);
输出:
2. 修改arguments
function fn(a) {
arguments[0] = 6;
console.log(a);
console.log(arguments[0]);
}
fn(2, 3, 4);
输出:
可以看到,通过修改形参的值和 arguments 的值,不管改的是两者中的哪一个,都会影响对应双方的值。
七. 本篇小结
1. 每一个函数,都有一个默认参数,参数是一个数组形式的arguments对象,可以通过数组下标来获取到对应的值。
2. 当我们传递的实参个数大于形参的个数时,依然可以通过arguments获取到对应的实参数据,而且修改形参对应的值,arguments的值也会更新,反之亦然。