arguments
函数接收参数,实际上是接收到一个数组
ECMAScript函数即使定义的函数只接收2个参数,在调用此函数时也不是必须要传2个参数才行,可以传一个、多个甚至是不传。之所以会这样是因为ECMAScript中的参数在内部是用一个数组来表示的;
函数接收到的始终是这个数组,而不关心数组中包含了哪些参数。
用arguments访问参数数组
在函数的体内可以通过arguments这个对象来访问这个参数数组,来获取传递给数组的每一个参数。
arguments与数组类似(但不是arr的实例)因为和数组一样可以使用“ [ ] ” 来访问每一个元素(如第一个元素arguments[0]),也可以用length确定传进来的参数个数。
例如:一个函数
function say(name,message){alert('Hello'+name+','+message);}
可以像下面这样重写:(也就是不显示的使用命名参数),这个重写的函数中不包含命名的参数,功能和上面是一样的。
也就是说ECMAScript函数的一个重要特点:在ECMAScript中解析器不会验证命名参数,命名参数只提供便利,但不是必须。
function say(name,message){alert('Hello'+arguments[0]+','+arguments[1]);}
用arguments对象的length属性可以知道有多少个参数传递给函数
例如:
function say(){alert(arguments.length);howManyArgs("string",45);//2howManyArgs();//0howManyArgs(45);//1}
执行上面这段代码会弹出3个信息框分别显示2 0 1。利用这一点可以实现函数接收任意参数分别来实现对应的功能。例如:
function add(){if(arguments.length==1){alert(arguments[0]+10);//只有一个参数时给这个参数+10}else if(arguments.length==2){alert(arguments[0]+arguments[1]);//有两个参数时,将两个参数相加并返回结果}}//调用add(10)//20add(30,20)//50
arguments对象可以与命名参数一起使用
例如:(arguments[0]的值与num1的值相同,arguments[1]的值与num2的值相同)
function doAdd(num1,num2){if(arguments.length==1){alert(num1+10);}else if(arguments.length==2){alert(arguments[0]+num2);}}
arguments的值永远与对应命名参数的值保持同步
如下函数:每次执行这个函数都会将第二个参数的值改为10,因为arguments中的值与对应命名参数的值保持同步,因此,修改了arguments[1],也就修改了num2,最后它们的值都会变为10
1.值得注意的是 虽然值会同步,但并不是意味着读取这两个值会访问相同的内存空间;它们的内存空间是独立的,只是值会同步。
2.另外,如果只传了一个参数,那么arguments[1]的值不会反映到命名参数中,因为arguments对象的长度是由传入参数的个数决定的,而不是由定义函数时命名参数的个数决定的。
3.另外,没有传递值的命名参数会被赋予undefined值,类似与定义了一个变量但是没有初始化(例如下面函数如果只传了一个参数,num2则为undefined)
function doAdd(num1,num2){arguments[1]=10alert(arguments[0]+num2);}