zoukankan      html  css  js  c++  java
  • JS函数重载解决方案

     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>
  • 相关阅读:
    CAD中的各种Polyline
    在CAD二次开发中使用状态条按钮
    在CAD二次开发中使用进度条
    EXSI6.5复制文件太慢的解决方法
    vlan交换机的端口模式有哪几种
    此计算机上的安全设置禁止访问其他域的数据源
    Could not write to output file 'c:WindowsMicrosoft.NET ASP.NET Filesxx' -- 'Access is denied
    添加现有文件夹到项目解决方案
    SSM-MyBatis-18:Mybatis中二级缓存和第三方Ehcache配置
    SSM-MyBatis-17:Mybatis中一级缓存(主要是一级缓存存在性的证明,增删改对一级缓存会造成什么影响)
  • 原文地址:https://www.cnblogs.com/xiaochao12345/p/4137513.html
Copyright © 2011-2022 走看看