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