javascript其实是不支持重载的,这篇文章会和java语言函数的重载对比来加深对javascript函数重载的理解。

      以下我会假设读者不了解什么是重载所以会有一些很基础的概念的,如果你是大神那么你可以离开了。

      说函数的重载之前大家要理解什么是函数的重载,由于开头说JavaScript不支持函数的重载(不代表不能实现重载)本文是以java来做对比的所以先说说java函数重载的实现看下面一段代码

public  class Person {
       public static void main(String[] args){
        Person info = new Person();
        info.show();
        info.show("小明");
        info.show("小明",24);
        info.show(24,"小明");
    }
    public void show(){
        System.out.println("没有参数可以执行");
    }
    public void show(String name){
        System.out.println("----------- 1 --------------");
        System.out.println("Perosn name:"+name);
    }
    public void show(String name,int age){
        System.out.println("----------- 2 --------------");
        System.out.println("Perosn name:"+name);
        System.out.println("Perosn age:"+age);
    }
    public void show(int age,String name){
        System.out.println("----------- 2 --------------");
        System.out.println("Perosn age:"+age);
        System.out.println("Perosn name:"+name);
    }
}
//输出结果如下:
/**

    没有参数可以执行
    ----------- 1 --------------
    Perosn name:小明
    ----------- 2 --------------
    Perosn name:小明
    Perosn age:24
    ----------- 2 --------------
    Perosn age:24
    Perosn name:小明
**/

    在同一个Person出现了多次同名的show方法这些show方法参数个数不同或者参数类型不同 Java 会根据参数的个数和类型来判断应该调用哪个重载方法,参数和类型完全匹配的方法将被执行所以三个show方法都可以得到正确的执行

在来看看javascript如果在同一个作用域内有两个相同名字的函数那么最后一个会覆盖掉前一个重载就无从谈起把上面的java代码转换成JavaScript如下:。

class Person {
    show(){
    console.log("没有参数也可以执行");
    }
    show(name){
    console.log("----------- 1 --------------");
    console.log("Perosn name:"+name);
    }
    show(name,age){

    console.log("----------- 2 --------------");
    console.log("Perosn name:"+name);
    console.log("Perosn age:"+age);
    }
    show(age,name){

    console.log("----------- 2 --------------");
    console.log("Perosn name:"+age);
    console.log("Perosn age:"+name);
    }
}
let person = new Person();
    person.show();
    person.show("小明");
    person.show("小明",24);
    person.show(24,"小明");

    如果你能猜出输出的正确结果证明你理解了为什么说JavaScript不支持重载。

/**
    输出结果如下:
**/
----------- 2 --------------
Perosn name:undefined
Perosn age:undefined
----------- 2 --------------
Perosn name:小明
Perosn age:undefined
----------- 2 --------------
Perosn name:小明
Perosn age:24
----------- 2 --------------
Perosn name:24
Perosn age:小明

    连续4次输出都是执行了Person的最后那个show方法前面的同名方法都被覆盖了。本身JavaScript的参数也没有定义类型一说不能像Java根据参数定义类型调用的时候传参对应类型去执行相应的方法;JavaScript要想像java那样一个方法传入不同的参数得到不同的结果输出要怎么做?我们改写一下上面的js代码实现想java函数重载的功能。

class Person {
    show(name,age){
    if(name == null){
        console.log("没有参数也可以执行");
    }
    if(typeof name == "string" && age == null){
        console.log("----------- 1 --------------");
  console.log("Perosn name:"+name);
    }
    if(typeof name == "string" && typeof age == "number"){
        console.log("----------- 2 --------------");
        console.log("Perosn name:"+name);
        console.log("Perosn age:"+age);
    }
    if(typeof name == "number" && typeof age == "string"){
        let tmp = name;
        name = age;
        age = tmp;
        console.log("----------- 2 --------------");
        console.log("Perosn age:"+age);
        console.log("Perosn name:"+name);

    }

    }

}
let person = new Person();
person.show();
person.show("小明");
person.show("小明",24);
person.show(24,"小明");
//输出结果如下:
/**

    没有参数可以执行
    ----------- 1 --------------
    Perosn name:小明
    ----------- 2 --------------
    Perosn name:小明
    Perosn age:24
    ----------- 2 --------------
    Perosn age:24
    Perosn name:小明
**/

    以上我们完成了JavaScript函数重载的实现输出结果和java的例子一样,通过传入参数类型不同执行相应的操作实现重载。

理解javascript函数的重载的更多相关文章

  1. 深入理解javascript函数系列第二篇——函数参数

    × 目录 [1]arguments [2]内部属性 [3]函数重载[4]参数传递 前面的话 javascript函数的参数与大多数其他语言的函数的参数有所不同.函数不介意传递进来多少个参数,也不在乎传 ...

  2. 理解JavaScript函数参数

    前面的话 javascript函数的参数与大多数其他语言的函数的参数有所不同.函数不介意传递进来多少个参数,也不在乎传进来的参数是什么数据类型,甚至可以不传参数. arguments javascri ...

  3. 深入理解javascript函数系列第一篇——函数概述

    × 目录 [1]定义 [2]返回值 [3]调用 前面的话 函数对任何一门语言来说都是一个核心的概念.通过函数可以封装任意多条语句,而且可以在任何地方.任何时候调用执行.在javascript里,函数即 ...

  4. 深入理解javascript函数系列第三篇——属性和方法

    × 目录 [1]属性 [2]方法 前面的话 函数是javascript中的特殊的对象,可以拥有属性和方法,就像普通的对象拥有属性和方法一样.甚至可以用Function()构造函数来创建新的函数对象.本 ...

  5. javascript函数没有重载测试

    今天继续学习javascript系列教程,虽然是基础,但我觉得还是有必要用心来学习的,不要怕难,不用怕忘记,不要怕学不会.哪个高手不是从零开始的,我要坚定自己的学习信心,并且认真的走下去.虽然路途艰辛 ...

  6. 深入理解javascript函数系列第一篇

    前面的话 函数对任何一门语言来说都是核心的概念.通过函数可以封装任意多条语句,而且可以在任何地方.任何时候调用执行.在javascript里,函数即对象,程序可以随意操控它们.函数可以嵌套在其他函数中 ...

  7. 深入理解javascript函数系列第三篇

    前面的话 函数是javascript中特殊的对象,可以拥有属性和方法,就像普通的对象拥有属性和方法一样.甚至可以用Function()构造函数来创建新的函数对象.本文是深入理解javascript函数 ...

  8. 深入理解JavaScript函数

    本篇文章主要介绍了"深入理解JavaScript函数",主要涉及到JavaScript函数方面的内容,对于深入理解JavaScript函数感兴趣的同学可以参考一下. JavaScr ...

  9. 深入理解JavaScript函数参数

    前面的话 javascript函数的参数与大多数其他语言的函数的参数有所不同.函数不介意传递进来多少个参数,也不在乎传进来的参数是什么数据类型,甚至可以不传参数. arguments javascri ...

随机推荐

  1. PullToRefreshListView上拉加载、下拉刷新 eclipse项目

    说明:此项目实在fragment中的,需要依赖library完成,还用到了Xuitls.jar包.使用了Pull解析XML eclipse中的项目: //注意:此刷新功能是使用的第三方的PullToR ...

  2. a:link visited hover active

    CSS中a:link.a:visited.a:hover.a:active的用法:建议:尽可能的手写代码,可以有效的提高学习效率和深度.在网页设计中,设计美观的超链接效果可以增强网站的用户体验,可能会 ...

  3. css05 字体以及行间距

    <head><meta charset="utf-8"><title>无标题文档</title><style>#box{ ...

  4. spark中groupByKey与reducByKey

    [译]避免使用GroupByKey Scala Spark 技术   by:leotse 原文:Avoid GroupByKey 译文 让我们来看两个wordcount的例子,一个使用了reduceB ...

  5. android TextView 之探究

    1:插入图片替换 //代码 mSubjectDetailView = (TextView) findViewById(R.id.subject_detail); CharSequence text = ...

  6. update set from where

    原文链接:http://blog.csdn.net/xcbsdu/article/details/6736503 关于update set from where 下面是这样一个例子: 两个表a.b,想 ...

  7. hdu_4467_Graph(莫队算法思想)

    题目连接:hdu_4467_Graph 题意:给你n个点,m条边,每条边有一个权值,有两个操作,一个是修改单点的颜色,一个是询问边的两个端点都为指定颜色的权值和 题解:这题如果暴力的话,就是维护3个a ...

  8. linux仅修改文件夹权限;linux 分别批量修改文件和文件夹权限

    比如我想把/var/www/html下的文件全部改成664,文件夹改成775,怎么做呢 方法一: 先把所有文件及文件夹改成664,然后把所有文件夹改成775 root@iZ25bq9kj7yZ:/ c ...

  9. POJ2718 递归套递归

    就是给你一个数,排列组合,然后问如何排列之间的差值最小. 我之前的想法是一个递归,然后两个for循环枚举L1和L2,结果TLE了,然后想了一下剪枝发现没办法剪,然后看了一下别人的代码,用了next_p ...

  10. SQL Server2008数据库中删除用户,提示数据库主体在该数据库中拥有 架构,无法删除

    一个数据库,运行在SQL Server 2008下,数据库用户无法删除,在删除时提示“数据库主体在该数据库中拥有架构,无法删除”.原因很简单,就是由于此用户在数据库中拥有某些架构的所有权,将相关架构的 ...