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>

     

  • 相关阅读:
    实现倒计时
    slidingMenu使用中侧滑回界面后,出现无焦点问题
    android eclipse 下Device无设备问题解决
    android cordova java.lang.Throwable: EventHub.removeMessages(int what = 107) is not supported before the WebViewCore is set up问题的解决和想法
    Android Cordova 对于软键盘弹出后覆盖输入域的解决
    Extjs最后一页数据删除之后自动返回上一页
    jquery Unexpected token i
    批量删除.svn文件夹、.svn文件
    mysql创建用户权限
    mysql存储过程解决数组传参及游标CURSOR的问题解决方案
  • 原文地址:https://www.cnblogs.com/ranzige/p/3635758.html
Copyright © 2011-2022 走看看