可以用函数内置的argument模拟函数重载
什么是arguments ?
arguments 是一个类似数组的对象, 对应于传递给函数的参数。
属性
1.arguments.length
返回当前函数的参数数量
function myMultiplication() {
console.log(arguments.length);//2
return arguments[0] * arguments[1]
}
console.log(myMultiplication.call(null,6,6));
2.arguments.callee
返回一个对函数的引用,该函数调用了当前函数 ECMAScript (ES5) 禁止使用 arguments.callee()
具体实现
1.根据参数个数重载
function myMath() {
if (arguments.length === 2) {
return arguments[0] + arguments[1]
} else if (arguments.length === 3) {
return arguments[0] + arguments[1] + arguments[2]
}else {
return 0;
}
}
console.log(myMath(1,1));//2
console.log(myMath(1,1,1));//3
2.限制函数参数类型重载
function myMathAdd() {
// console.log(arguments.length)
if (arguments.length === 0) { return 0; }
var res = 0
for (var i = 0; i < arguments.length; i++) {
if (arguments[i].constructor === Number) {//判断参数类型
res = res + arguments[i];
}
}
// console.log(res);
return res;
}
console.log(myMathAdd.call(myMathAdd, 1, 2, 3))//6
console.log(myMathAdd.call(myMathAdd, 6, 6))//12
JS不需要函数重载
函数重载是java,C#,C等强类型语言的使用者的习惯,在现阶段看来,无非是多写几个字多取几个函数名的而已,况且在JS中,相同函数名会导致后者覆盖前者.
function testOverload(){
return arguments[0] + arguments[1];
}
function testOverload(){
return arguments[0] + arguments[1] + arguments[2];
}
console.log(testOverload.call(null,1,1));//NaN
console.log(testOverload.call(null,1,1,1));//3
上述的例子已经很明显了,反映JS函数的一个特性,虽然JS的函数也叫函数,但JS的函数和其他强类型语言(如Java)的函数还是有区别的,在java中是通过方法名、参数类型、参数数量、参数顺序这四个方面(方法签名)来确定一个函数。而JS只通过函数名来确定函数,并且JS的函数是对象,函数名是普通变量。上述的testOverload()相当于绑定了两个函数对象,从结果得知,后者必然覆盖前者,并不会同时存在,所以函数重载也就没有必要了。
其实多写几个字也不累。
参考
<li><a>https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/arguments
网友评论