JavaScript 原生不支持传统意义上的函数重载,同名函数定义会导致后者覆盖前者。本文通过示例展示这一现象,并深入解析如何利用 arguments 对象获取参数个数与值,从而在 JavaScript 中模拟实现函数重载功能。
JavaScript 函数覆盖现象
与其他编程语言不同,JavaScript 没有函数签名的概念。所谓函数签名,通常指函数接受的参数类型和个数,部分观点也包含返回类型。具体定义可参考相关技术文档。
因此,JavaScript 无法像其他语言那样直接实现方法名相同但参数个数不同的重载机制。读者可以尝试以下代码验证。
代码如下:
function show(){
alert("1");
}
function show(num1){
alert(num1);
}
window.onload=function(){
show();
show(2);
}
通过断点调试可以发现,不带参数的 show 方法不会被执行,因为它被后续定义的 show(num1) 方法覆盖了。
利用 arguments 实现重载
那么,JavaScript 中是否真的无法实现“重载”呢?答案是可以的,只是实现方式不同。关键在于使用 arguments 对象。
什么是 arguments?在 JavaScript 中,它是一个特殊的内置属性,行为类似数组,可以通过下标索引获取参数值(尽管它并非真正的数组实例),并通过 length 属性获取传递的参数个数。
代码如下:
function showParamsCount(){
alert("参数个数:"+arguments.length);//输出:参数个数:4
alert("下标索引为3的参数:"+arguments[3]);//输出: 下标索引为3的参数:你好
}
window.onload=function(){
showParamsCount("Hello",4,5,"你好");
}
此外需注意,JavaScript 函数的命名参数并非强制要求。若要获知调用时实际传递了多少个参数,必须依赖 arguments 对象进行判断。
基于上述原理,下面演示一个简单的重载实现方法:
通过这种方式,JavaScript 即可实现类似重载的功能。
在阅读《JavaScript 高级程序设计》时注意到,arguments 的值与对应的命名参数值始终保持同步,这一细节常被忽略。
关于 JavaScript “重载”的基础知识介绍至此。