在javascript中,出现在函数定义文法中的参数列表是函数的形式参数,简称形参,一个函数可以有一个或者多个形参,函数对象定义时的形参数量可以通过length属性获得,例如
function add(x,y){ return x+y; } window.cross=function(v1,v2){ return v1*2+v2*1; } document.write('max_lenght='+max.length+'<br>');//max_lenght=2 document.write('wds_cross_length='+window.cross.length);//wds_cross_length=2
函数调用时传入的参数是函数的实际参数,简称实参,一般情况下,实参和形参的数量是相同的,但在javascript的中并不强求这一点,函数的形参和实参数量可以不相同。如果实参少于形参,则多余的形参值为undefined(也可以通过缺省参数来改变多余形参的值,如下例);如果函数实参多于形参,则多出来的那一部分不能通过形参标识符来访问。
function add(x,y){ if(!y){ y=0; } return x+y; } document.write('add_value='+add(2)+'<br>');//add_value=2 document.write('add_value='+add(2,4)+'<br>');//add_value=6
Arguments对象是一个集合,,可以按照数字下标获取传递给函数的参数值。例如arguments.length可以获得传递给函数的参数的个数,如果希望函数的形参个数和实参个数相同,可以通过通过访问函数的length和arguments的length进行比较。由于可以通过length的属性的到长度和通过下标访问,Arguments的行为有点像数组,但他其实并不是数组,它不具备JAVASCRIPT核心数组的一些方法,如join、sort、slice等。
Arguments的一个重要功能是用来实现接受多种不同类型不同数目实参的函数,类似于重载。
function Point(){ if(arguments.length==0){ this.x=0; this.y=0; }else if(arguments.length==1){ var p=arguments[0]; if(p instanceof Point){ this.x=p.x; this.y=p.y; }else if(typeof(p)=="number" || p instanceof Number){ this.x=Number(p); this.y=0; }else{ throw new TypeError("参数类型错误");//如果这个参数既不是Point又不是Number,抛出类型错误异常。 } }else if(arguments.length==2){ var x=arguments[0]; var y=arguments[1]; if((typeof(x)=="number"||x instanceof Number)&&typeof(y)=="number"||y instanceof Number){ this.x=x; this.y=y; }else{ throw new TypeError("参数类型错误"); } }else{ throw new TypeError("参数类型错误"); } } try{ var x =new Point(2,3); document.write("x="+x.x+"<br>"); document.write("y="+x.y+"<br>"); document.write("****************"+"<br>"); x =new Point(new Point(4,6)); document.write("x="+x.x+"<br>"); document.write("y="+x.y+"<br>"); document.write("****************"+"<br>"); x =new Point(10); document.write("x="+x.x+"<br>"); document.write("y="+x.y+"<br>"); document.write("****************"+"<br>"); x =new Point("a",true); document.write("x="+x.x+"<br>"); document.write("y="+x.y+"<br>"); }catch(e){ document.write("参数类型错误"); }执行结果: x=2 y=3 **************** x=4 y=6 **************** x=10 y=0 **************** 参数类型错误
引用
注意:在使用了命名参数的函数中,arguments中的参数也始终是相应命名参数的别名,不管这个参数是值类型还是引用类型,改变arguments中的参数值一定会影响到对应的命名参数,反之亦然。