arguments
在js中函数的参数天生不定参,形参可以比实参多,实参也可以比形参多并且不报错,因为在每个函数中都有一个arguments,叫做实参列表,它是一个类似于数组的对象,它会按照实参的顺序保存着所有传递给函数的实参。也就是说它会接收完所有的实参。
没有传递值的形参,值默认为undefined。
// num2的值是undefined
//形参就相当于在函数中隐式的声明了两个变量var num1,num2
function fn(num1,num2){
//arguments接收完所有的实参
//此处打印1 arguments[0]代表着第一个实参
console.log(arguments[0]);
}
//这么做不报错
//实参
fn(1);
arguments的作用:
我想求任意个数的和该怎么办? 也就是说传递的值的个数是不固定,所以说你定义的形参是不固定的,使用arguments就可以解决这个问题,你不需要定义形参来接收实参,arguments里面就保存了所有的实参,因此我们只要把arguments里的每一项取出来相加就行了。
arguments有一个属性lenght表示arguments的长度。
function sum(){
for(var i = 0, res = 0; i < arguments.length ;i++){
res += arguments[i];
}
console.log(res);
}
//实参的个数不固定
sum(1,2,3,4,5,6,7,8,9,10); //55
sum(1,2,3) //6
实参和形参相映射:
意思是arguments的值永远和形参保持同步并且它们不是同一个内存空间,形参的值发生变化对应的arguments的某一项的值也跟着变化,同理,aguments的某一项值发生变化对应的形参也会跟着变化,前提是arguments实参列表和形参数相对应。
function test(num1,num2){
num1 = 2
/*
arguments[0]也变成2了
arguments[0]和num1保持着映射关系
num1是第一个形参被修改对应的第一个实参arguments[0]也跟着变化
num1的改变会反映到arguments[0]身上
但是arguments[0]和num1并不是同一个内存空间
但是它们的值就是会保持同步
*/
console.log(arguments[0]); //2
}
test(1,2)
还有一个种情况就是arguments实参列表的数量和形参的数量没有对应上则不会发生映射关系,原因是arguments有多少项是根据你传过来的实参有多少。换句话说你都没有第二个实参你怎么和第二个形参相去映射。
function test(num1,num2){
num2 = 4;
/*
由于实参只有一个,而形参有二个,
因此num2和arguments[1]不会发生映射关系。
换句话说都没有arguments[1]这一项,怎么和num2映射呢
因此打印arguments[1]是undefined
*/
console.log(arguments[1]); //undefined
}
test(1)