ECMAScript函数的参数与段多事语言中函数的参数有所不同。ECMAScript中的函数无所谓传几个参数和类型,解析器永远不会报错。
例如:
function doAdd1(num1,num2){
alert(num1+num2);
}
doAdd1(10);//NAN
doAdd1(30,20);//50
解析器照样不会报错,只是如果传递一个参数计算出来的结果为NAN
之所以这样,追究其原因,是因为在ECMASript中的参数内部是用一个数组表示的。函数接收到的始终都是一个数组。
实际上,在函数体内可以通过arguments对象来访问这个参数数组,从而获取传递给函数的每一个参数
arguments对象类似于数组,可以使用方括号语法访问每一个元素,arguments[0]、arguments[1],并且可以使用length属性来确定传递进来多少个参数。
通过arguments对象的length属性可以确定也有多少个参数传递给了函数
例如下面的例子:
function doAdd(){
if(arguments.length == 1){
alert(arguments[0]+10);
}
else if(arguments.length == 2){
alert(arguments[0] + arguments[1]);
}
}
doAdd(10);//20
doAdd(30,20);//50
arguments.length获知到参数不同的个数判断进入不同的分支语句,
这个特性虽然算不上完美的重载,但也足够弥补ECMAScript的这一缺憾了。
另一个与参数相关的就是arguments对象可以和命名参数一起使用
例如:
//arguments对象和命名参数一起使用
function doAdd(num1,num2){
if(arguments.length == 1){
//内存空间相互独立,值会同步
alert(num1+10);
}
else if(arguments.length == 2){
alert(arguments[0] + num2);//50
}
}
doAdd(10);//20
doAdd(30,20);//50
由于num1的值与arguments[0]的值相同,因此可以互换使用
arguments的值与对应命名参数的值保持同步
例如下面的写法与上面例子的结果相同
function doAdd(num1,num2){
if(arguments.length == 1){
//内存空间相互独立,值会同步
alert(num1+10);//arguments的值与对应命名参数的值保持同步
}
else if(arguments.length == 2){
alert(num1 + num2);//num1 = arguments[0],num2 = arguments[1];
}
}
doAdd(10);//20
doAdd(30,20);//50
说在最后:没有传递值的命名参数将自动被赋予undefind值。就和定义了变量但又没有初始化一样