ECMAScript如何实现函数重载

时间:2023-01-06 19:05:07

           重载函数的定义:在相同的声明域中,如有多个函数名相同的,而参数表不同的(参数类型不同或参数个数不同),返回值类型可以相同也可以不同的函数,称之为重载函数。函数的参数表是区别重载函数的唯一标识,而非函数的返回值。重载函数常用来实现功能类似而所处理的数据类型不同的问题。

           然而,ECMAScript函数不能像传统意义上那样实现重载。如果在ECMASript中定义了两个名字相同的函数,则该名字只属于后定义的函数。例:  

function Add(a){
    return a+10;
};
function Add(a){
    return a+20;
}

var result=Add(2);
alert(result);     //22

           但是可以通过判断传入参数的个数和类型来实现函数重载这一功能。

           1. 通过判断传入参数的个数

           ECMAScript中的参数在内部是用一个数组来表示的。在函数体内,可以通过arguments对象来访问这个参数数组。arguments对象与数组类似,可以使用方括号语法来访问它的每一个元素(即arguments[0]是第一个参数),使用length属性来确定传递参数的个数。可利用length来判断传如参数的个数,进而执行不同的操作。例:      

function doSum(){
   if(arguments.length==1){
     alert(arguments[0]+20);
} else if(arguments.length==2){
     alert(arguments[0]+arguments[1]); 
}
}
doSum(10);     //30
doSum(10,60);      //70

         对于EMCAScript函数的参数进行一些说明:ECMAScript函数中,命名的参数只是提供便利,并不是必须的。即,在这定义函数时即使没有命名参数出现,只要在实际使用时传入了参数,就可以通过arguments访问到。 

         还有另一种利用闭包特性的实现重载的方法,详见https://www.cnblogs.com/yugege/p/5539020.html。         

 

2. 通过判断传入参数的类型

           要检测一个变量是不是基本数据类型,可以通过typeof操作符来确定一个变量是string、number、boolean还是undefined。需要注意的是,如果变量的值是一个对象或null,则typeof操作符会返回object。使用实例:

function DoSomething(){
    if(typeof(arguments[0])== "number"){
       alert(arguments[0]+10);
} else if(typeof(arguments[0])== "string"){
       alert(arguments[0].split(""));
     }
}
DoSomething(10);            //20
DoSomething("Hello");      //H,e,l,l,o

          想要知道某个对象变量是什么类型的变量,可使用instanceof操作符。如果变量是给定引用类型的实例,instanceof操作符会返回true。根据规定,所有引用类型的值都是Object的实例,因此在检测一个引用类型是否是Object构造函数的实例时,instanceof会始终返回true。但是如果用instanceof操作符检测基本类型是,会始终返回false。使用实例:

function DoSomething(a){
    if(a instanceof Array){
       alert(a.length);
} else if(a instanceof Object){
       alert(a.name);
     }
}
DoSomething([1,2,3]);                     //3
DoSomething({"name":"Sofia"});     //Sofia