ECMAScript函数不在乎传进来多少个参数,也不在乎传进来的参数是什么类型。原因是因为ECMAScript中的参数在内部用一个数组来表示。函数接收到的始终是这个数组,而不关心数组中包含哪些参数和参数的个数。实际上,在函数体内可以通过arguments对象来访问这个参数数组,从而获取传递给函数的每一个参数。
arguments对象
这个对象只是和数组类似,并不是Array的实例,之所以与数组类似是因为:
- 可以使用方括号的语法来访问
- 可以使用length属性来确定传进来的参数个数,可以根据传进来的不同参数个数,做不同的操作
使用
1.arguments对象可以与命名参数一起使用
2.传递不同的参数个数,会影响到arguments对象和命名参数的值
function doAdd(num1,num2){
arguments[0] = 10;
arguments[1] = 10;
alert(arguments[1]);
alert(num2);
}
doAdd(20);// 10 undefined,这里只传递了一个参数,对arguments[1]进行修改并不会反映到num2上,这是因为arguments对象的长度是由传入的参数个数决定的,不是由定义函数时的的命名参数个数决定的。还有没有传递值的命名参数将自动被赋予undefined值
doAdd(5,20);//10 10
如果传递了相应的命名参数,对arguments对象中的值进行改变,也会反映到命名参数中,即会同步。但是读取这两个值并不会访问相同的内存空间,它们的内存空间是独立的。
ECMAScript中的所有参数传递的都是值,不可能通过引用传递参数
没有重载
因为JavaScript中的函数没有签名,因为其参数是由包含零或多个值的数组来表示的。而没有函数签名,真正的重载是不可能的。
function doAdd(num1){
alert(num2+num1);
}
function doAdd(num1,num2,num3){
alert(num1);
}
doAdd(5); //5 后面定义的函数覆盖了之前的那个函数
但是可以通过检查传入函数的参数类型和个数并作出不同的反应,可以模仿方法的重载。