函数的参数和Arguments对象

本文深入探讨JavaScript中的函数参数概念,包括形式参数与实际参数的区别、形参数量的获取方式及形参与实参数量不匹配时的处理机制,并介绍了如何利用Arguments对象实现可变参数的函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  在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
****************
参数类型错误

[quote]注意:在使用了命名参数的函数中,arguments中的参数也始终是相应命名参数的别名,不管这个参数是值类型还是引用类型,改变arguments中的参数值一定会影响到对应的命名参数,反之亦然。[/quote]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值