zoukankan      html  css  js  c++  java
  • 用JavaScript实现函数重载

               重载函数的定义:在相同的声明域中,如有多个函数名相同的,而参数表不同的(参数类型不同或参数个数不同),返回值类型可以相同也可以不同的函数,称之为重载函数。函数的参数表是区别重载函数的唯一标识,而非函数的返回值。重载函数常用来实现功能类似而所处理的数据类型不同的问题。

               然而,ECMAScript函数不能像传统意义上那样实现重载。如果在ECMASript中定义了两个名字相同的函数,则该名字只属于后定义的函数。例:  

    function Add(a){
        return a+10;
    };
    function Add(a){
        return a+20;
    }
    
    var result=Add(2);
    alert(result);     //22

               但是可以通过判断传入参数的个数和类型来实现函数重载这一功能。

               1. 通过判断传入参数的个数

               ECMAScript中的参数在内部是用一个数组来表示的。在函数体内,可以通过arguments对象来访问这个参数数组。arguments对象与数组类似,可以使用方括号语法来访问它的每一个元素(即arguments[0]是第一个参数),使用length属性来确定传递参数的个数。可利用length来判断传如参数的个数,进而执行不同的操作。例:      

    function doSum(){
       if(arguments.length==1){
         alert(arguments[0]+20);
    } else if(arguments.length==2){
         alert(arguments[0]+arguments[1]); 
    }
    }
    doSum(10);     //30
    doSum(10,60);      //70

             对于EMCAScript函数的参数进行一些说明:ECMAScript函数中,命名的参数只是提供便利,并不是必须的。即,在这定义函数时即使没有命名参数出现,只要在实际使用时传入了参数,就可以通过arguments访问到。 

             还有另一种利用闭包特性的实现重载的方法,详见https://www.cnblogs.com/yugege/p/5539020.html。         

    2. 通过判断传入参数的类型

               要检测一个变量是不是基本数据类型,可以通过typeof操作符来确定一个变量是string、number、boolean还是undefined。需要注意的是,如果变量的值是一个对象或null,则typeof操作符会返回object。使用实例:

    function DoSomething(){
        if(typeof(arguments[0])== "number"){
           alert(arguments[0]+10);
    } else if(typeof(arguments[0])== "string"){
           alert(arguments[0].split(""));
         }
    }
    DoSomething(10);            //20
    DoSomething("Hello");      //H,e,l,l,o

              想要知道某个对象变量是什么类型的变量,可使用instanceof操作符。如果变量是给定引用类型的实例,instanceof操作符会返回true。根据规定,所有引用类型的值都是Object的实例,因此在检测一个引用类型是否是Object构造函数的实例时,instanceof会始终返回true。但是如果用instanceof操作符检测基本类型是,会始终返回false。使用实例:

    function DoSomething(a){
        if(a instanceof Array){
           alert(a.length);
    } else if(a instanceof Object){
           alert(a.name);
         }
    }
    DoSomething([1,2,3]);                     //3
    DoSomething({"name":"Sofia"});     //Sofia

               

  • 相关阅读:
    说说毕业两年多的经历
    egret: if判断语句不能写在addEventListener监听事件外面吗?
    egret wing exml文件突然在设计和预览模式下不可见!
    egret:设置滚动视图、隐藏滚动条以及层级的问题
    egret:list网格布局
    egret 自动播放音乐问题:ios 自动播放音乐失效
    private static和public static的意义
    setTimeout()的第三个参数
    egret 学习之once()与addEventListener()
    egret 入门学习笔记之问题解决
  • 原文地址:https://www.cnblogs.com/SofiaTJU/p/8987828.html
Copyright © 2011-2022 走看看