在使用 function 关键字定义(非箭头)函数时,可以在函数内 部访问 arguments 对象,从中取得传进来的每个参数值。arguments 对象是一个类数组对象(但不是 Array 的实例),因此可以使用中括号语法访问其中的元素(第一个参数是 arguments[0],第二个参数是 arguments[1])。而要确定传进来多少个参数,可以访问 arguments.length 属性。
下面的doAdd()
函数把第二个参数的值重写为
10
。因为
arguments
对象的值会自动同步到对应的命名参数,所以修改 arguments[1]
也会修改
num2
的值,因此两者的值都是
10
。但这并不意味着它们都访问同一个内存地址,它们在内存中还是分开的,只不过会保持同步而已。另外还要记住一点:如果只传了一个参数,然后把 arguments[1]设置为某个值,那么这个值并不会反映到第二个命名参数。这是 因为arguments
对象的长度是根据传入的参数个数,而非定义函数时给出的命名参数个数确定的。
对于命名参数而言,如果调用函数时没有传这个参数,那么它的值就是 undefined
。这就类似于 定义了变量而没有初始化。比如,如果只给 doAdd()
传了一个参数,那么
num2
的值就
undefined
。具体大家可以试一下。
function doAdd(num1, num2) {
arguments[1] = 10;
console.log(arguments[0] + num2);
}
doAdd(10,20)//20
doAdd()//NaN
修改命名参数也不会影响 arguments 对象,它始终以调用函数时传入的值为准
function makeKing(name = 'Henry') {
name = 'Louis';
return `King ${arguments[0]}`;
}
console.log(makeKing()); // 'King undefined'
console.log(makeKing('Louis')); // 'King Louis'
console.log(makeKing('Louis111')) //'King Louis111'