JS是如何实现函数重载效果的?——扒一扒隐形的arguments对象

JS是如何实现函数重载效果的?——扒一扒隐形的arguments对象

什么是重载?

通俗来说,函数重载就是同一个名字的函数完成相似但又不同的功能。通常是根据函数执行时的参数个数或者类型来执行不同的行为。

函数重载并不是某种程序语言的独有特性,而是一种处理方式,只是每种语言的实现方式不尽相同。Java中是可以为同一个函数写两个定义的,只要各自定义的时候,保证接收的参数个数或者类型不同,所以相当于在Java中,函数重载是内置了的,已经给你做好了。而在JS中,只要函数名相同,后面的定义就会覆盖前面的定义,所以无法想Java那样实现重载。但是我们可以通过JS本身的特点去模拟实现Java中函数重载的功能。

利用arguments对象来模拟函数的重载

JS中模拟重载的效果是通过arguments对象来实现的。arguments对象是所有(非箭头)函数中都可用的局部变量,默默存在在函数中。

JS中函数可以获取任意个数的参数

首先js中,函数可以接受任意多个参数而不会报错。其他语言中,不符合函数声明中参数要求的函数调用会报错。并且JS中函数获取的这些参数以类数组的形式存放在arguments对象中,所以arguments对象是类数组对象。

JS中,如果有参数多余,则会自动忽略多余的参数,不会报错。

以上均不会报错,输出结果为5,5,NaN,NaN。

参数可以任意个,那么如何获取函数的参数呢?答案就是arguments对象。arguments对象可以通过中括号加标号的方式arguments[i]获取参数值,通过arguments.length来获取参数的个数,这种操作有点像数组,但arguments是对象,不是数组类型,所以数组的其他使用方式并不适用。

arguments存储函数的参数

arguments获取了函数的参数,我们就可以根据函数的特点,比如个数来执行不同的函数语句,模拟重载的效果。

从例子可以看到,js通过arguments对象获取函数的参数,然后根据参数通过判断语句的结果去执行不同的功能,这就是通过显示的方式实现了函数重载的效果。因为有重载的效果,所以不用分别给微信、现金、刷卡等方式分别定义一个函数,然后分别调用。

发表评论