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>

     

  • 相关阅读:
    FZU 2169 shadow (用了一次邻接表存边,树形DP)
    win7中USB音箱没有声音解决的方法
    关于port的关闭——Linux
    JS来推断文本框内容改变事件
    hibernate 实体关系映射笔记
    java中接口的定义与实现
    理解WebKit和Chromium: 调试Android系统上的Chromium
    iOS与日期相关的操作
    Java正則表達式入门
    Windows内核之线程的调度,优先级,亲缘性
  • 原文地址:https://www.cnblogs.com/ranzige/p/3635758.html
Copyright © 2011-2022 走看看