JS的函数定义可以指定形式参数名称,多多少少我们会以为js至少可以支持参数个数不同的方法重载,然而遗憾的是这仅仅是一个假象,js所有的参数都是以arguments传递过去的,这个参数类似于数组,在函数调用的时候,所有的实参都是保存在了这个数据结构里面,我们定义函数的时候所指定的形式参数其实是为这个数据结构里面的数据定义一个快捷的访问方式。也就是说js所有的函数都是支持无限个参数的,加上数据类型是弱类型,那么JS的函数除了名称就真的没有方法区别了?

  办法总是有的,我们可以利用JavaScript中的特殊对象arguments来模拟函数重载。用它来判断传入参数的个数或类型以区分重载。

1.根据参数个数重载

js判断传入参数数量可以用arguments.length这个属性来判断;

1
2
3
4
5
6
7
8
9
10
11
12
13
<script type="text/javascript">
function add() {
    if (arguments.length == 1) {
        alert(arguments[0] + 10);
    }
    else if (arguments.length == 2) {
        alert(arguments[0] + arguments[1]);
    }
}
//函数调用
add(10);
add(10, 20);
</script>

2.根据参数类型重载

判断变量类型的3种方法:
1.用 typeof 语句判断变量类型,typeof语句返回类型对应的字符串。
2.用 instanceof 语句判断变量类型,instanceof语句返回true/false。
3.用 constructor 属性判断变量类型,这个属性返回用来构造该变量的构造函数引用。
对照表:可以看出用 typeof 不能准确的判断出具体的类型,所以我们用 constructor 来进行判断。

typeof string number object function boolean object object
constructor String Number Object Function Boolean Array User Define
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<script type="text/javascript">
function add()
{
    if (arguments.length == 0) return 0;
    var sum=0;
    for(var i=0; i<arguments.length; i++){
        if(arguments[i].constructor == Number){
        //或者改为:if(arguments[i] instanceof Number)
        //或者改为:if(typeof(arguments[i])=="number")
        sum += arguments[i];
      }
    }
    return sum;
}
//函数调用
alert(add(10));
alert(add(10,20));
</script>

转载于:https://www.cnblogs.com/ranran/p/javascript_chongzai.html

JS函数重载解决方案相关推荐

  1. 美丽的闭包,在js中实现函数重载

    引言 最近在js的学习中,看到了函数重载的问题,一开始,只看到了实现代码,看着代码冥思苦想了半个小时,总算是理清了其实现的原理,也为其实现的巧妙感到赞叹,也是在自己搞懂原理之后,去网络上搜索了下,才知 ...

  2. 【cocos2d-x从c++到js】10:JS与C++的交互2——JS与C++的“函数重载”问题

    对于C++来说,存在函数重载,例如: void CCNode::setScale(float scale) void CCNode::setScale(float scaleX,float scale ...

  3. Javascript中的函数重载-最佳做法

    用JavaScript伪造函数重载的最佳方法是什么? 我知道不可能像其他语言一样重载Javascript中的函数. 如果我需要两个函数一起使用foo(x)和foo(x,y,z) ,这是最佳/首选方式: ...

  4. js函数使用详细讲解!

    文章目录 使用函数 定义函数 声明函数 构造函数 函数直接量 定义嵌套函数 调用函数 函数调用 函数的返回值 方法调用 使用call和apply调用 使用new调用 函数参数 形参和实参 获取参数个数 ...

  5. c++学习笔记内联函数,函数重载,默认参数

    c++学习笔记内联函数,函数重载,默认参数 1 inline内联函数 C++中的const常量可以替代宏常数定义,如: const int A = 3;  #define A 3 C++中是否有解决 ...

  6. Js函数function基础理解

    正文:我们知道,在js中,函数实际上是一个对象,每个函数都是Function类型的实例,并且都与其他引用类型一样具有属性和方法.因此,函数名实际上是指向函数对象的指针,不与某个函数绑定.在常见的两种定 ...

  7. 五、Vue模块化开发学习笔记——JavaScript原始功能、匿名函数的解决方案、使用模块作为出口、CommonJS、ES6 export和import的使用

    一.JavaScript原始功能 -在网页开发的早期,js制作作为一种脚本语言,做一些简单的表单验证或动画实现等,那个时候代码还是很少的. 那个时候的代码是怎么写的呢? 直接将代码写在<scri ...

  8. 利用Javascript的“函数重载”实现自定义Alert样式

    默认的Alert只有一个简单的对话框,而且无法自定义样式!有时候弹出的提示需要很详尽,并且显得有些冗长,那么如何让用户直接看到重点信息呢?因为系统自带的Alert无法编辑样式所以我们只好自己重新定义一 ...

  9. Python 没有函数重载?如何用装饰器实现函数重载?

    摘要:Python 不支持函数重载.当我们定义了多个同名的函数时,后面的函数总是会覆盖前面的函数,因此,在一个命名空间中,每个函数名仅会有一个登记项(entry). 本文分享自华为云社区<为什么 ...

最新文章

  1. 深度学习的第一性原理!
  2. Docker 简介以及构架剖析
  3. 两个线程并发执行以下代码,假设a是全局变量,初始为1,那么以下输出______是可能的?
  4. SPOJ 375 树链剖分学习
  5. ubuntu下使用crontab定时器
  6. 一个跨国银行的敏捷转型案例要点之Agile Center
  7. IDA Plugin 编写基础
  8. 如何在 .NET Core 中获取 CPU 使用率
  9. 2019量子计算机上市公司,2019年第一炮:量子计算机终于来了!
  10. JavaScript 流行度最高,Java 屈居第三! | 2020 最新软件开发状况报告
  11. 16 寸MacBook Pro比14 寸风扇更强大,更耐用
  12. TreeSet与TreeMap
  13. 计算机专业里有服装设计吗,-------- 学服装设计有前途吗?
  14. 如何导出魔兽3模型到3Dmax里
  15. 解决软件注册机被win10杀灭问题
  16. “00后”消费数据分析,一文教你撩动“00后”购物欲
  17. C#使用FFmpeg实现视频压缩优化的探索
  18. poco mysql 登录_POCO数据库操作简介
  19. 笔记本计算机的功率一般多少,笔记本电脑功率是多少 怎么看笔记本功率多大...
  20. 线性电路中DAC和ADC的校准

热门文章

  1. 上古卷轴5python_基于Python-Flask的权限管理5:字典管理
  2. java哈希map 删除_HashMap1.8之节点删除分析
  3. etsi计算机应用场景,ETSI发布最新版DVB数据广播规范,包括五大应用场景
  4. axure命令行_Axure完成前端开发可行性探索
  5. Zabbix的分布式监控部署
  6. 实时流处理系统容错机制(一):综述
  7. mysql istransient_由于 MySQL 版本问题导入报错
  8. 抢红包算法 c++_十大排序算法(一):冒泡排序法
  9. java实现注销登录
  10. 博客作业02---线性表