理解javascript函数的重载
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函数的重载的更多相关文章
- 深入理解javascript函数系列第二篇——函数参数
× 目录 [1]arguments [2]内部属性 [3]函数重载[4]参数传递 前面的话 javascript函数的参数与大多数其他语言的函数的参数有所不同.函数不介意传递进来多少个参数,也不在乎传 ...
- 理解JavaScript函数参数
前面的话 javascript函数的参数与大多数其他语言的函数的参数有所不同.函数不介意传递进来多少个参数,也不在乎传进来的参数是什么数据类型,甚至可以不传参数. arguments javascri ...
- 深入理解javascript函数系列第一篇——函数概述
× 目录 [1]定义 [2]返回值 [3]调用 前面的话 函数对任何一门语言来说都是一个核心的概念.通过函数可以封装任意多条语句,而且可以在任何地方.任何时候调用执行.在javascript里,函数即 ...
- 深入理解javascript函数系列第三篇——属性和方法
× 目录 [1]属性 [2]方法 前面的话 函数是javascript中的特殊的对象,可以拥有属性和方法,就像普通的对象拥有属性和方法一样.甚至可以用Function()构造函数来创建新的函数对象.本 ...
- javascript函数没有重载测试
今天继续学习javascript系列教程,虽然是基础,但我觉得还是有必要用心来学习的,不要怕难,不用怕忘记,不要怕学不会.哪个高手不是从零开始的,我要坚定自己的学习信心,并且认真的走下去.虽然路途艰辛 ...
- 深入理解javascript函数系列第一篇
前面的话 函数对任何一门语言来说都是核心的概念.通过函数可以封装任意多条语句,而且可以在任何地方.任何时候调用执行.在javascript里,函数即对象,程序可以随意操控它们.函数可以嵌套在其他函数中 ...
- 深入理解javascript函数系列第三篇
前面的话 函数是javascript中特殊的对象,可以拥有属性和方法,就像普通的对象拥有属性和方法一样.甚至可以用Function()构造函数来创建新的函数对象.本文是深入理解javascript函数 ...
- 深入理解JavaScript函数
本篇文章主要介绍了"深入理解JavaScript函数",主要涉及到JavaScript函数方面的内容,对于深入理解JavaScript函数感兴趣的同学可以参考一下. JavaScr ...
- 深入理解JavaScript函数参数
前面的话 javascript函数的参数与大多数其他语言的函数的参数有所不同.函数不介意传递进来多少个参数,也不在乎传进来的参数是什么数据类型,甚至可以不传参数. arguments javascri ...
随机推荐
- Factory and AbstractFactory ——抽象与具体的分离
Factory and AbstractFactory——抽象与具体的分离 面向对象标准关注于抽取一系列事物的共同行为,组建一个基类.行为再划分成两类: 1:现在及以后不太可能会变化的行为. 2:以后 ...
- 视频 -> 帧 浅析
原创:转载请注明出处 关于帧率 首先以下几个概念必须弄清楚 1.一个帧就是一个画面 2.视频有无数个帧组成 3.表达时间的量 CMTime 的定义: typedef struct { CMTimeV ...
- 为Android增加硬件抽象层(HAL)模块访问Linux内核驱动程序
在Android硬件抽象层(HAL)概要介绍和学习计划一文中,我们简要介绍了在Android系统为为硬件编写驱动程序的方法.简单来说,硬件驱动程序一方面分布在Linux内核中,另一方面分布在用户空间的 ...
- 在win7/8/10鼠标右键添加带管理员权限的“在此处打开命令窗口”
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\Drive\shell\runas]@="@shell32.dll,-8506 ...
- linux系统定时重启tomcat
#touch auto-start.sh [root@Linux opt]# echo $LANGen_US.UTF-8 #vim auto-start.sh #!/bin/sh export LAN ...
- [转]Android 导入v7包常见错误,以及项目引用v7包错误解决
android下v4 v7 v21等包是android系统的扩展支持包,就想windows的系统补丁一个道理. android的扩展包主要是用来兼容低版本的,比如android3.0以后出现 ...
- 模版引擎Handlebars语法(1)
<script src="handlebars.js"></script></head><body> <div id=&quo ...
- HDU1969:Pie(二分)
Pie Time Limit : 5000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submissio ...
- java 线程安全
要认识java线程安全,必须了解两个主要的点:java的内存模型,java的线程同步机制.特别是内存模型,java的线程同步机制很大程度上都是基于内存模型而设定的. 浅谈java内存模型: 不同的平台 ...
- android 代码优化:封锁输出日志
可以使用 ProGuard 完全地删除任何在发布版中无用的语句,关于 ProGuard 参见: http://developer.android.com/guide/developing/tools/ ...