pidtfork 发表于 2020-10-28 17:56:16

如何写一个变参函数

本帖最后由 pidtfork 于 2020-10-28 18:01 编辑

如何写一个变参函数

问题

在写一些获取参数或者配置的函数时,函数的返回值或运行过程完全取决于传入的参数,这时如果用多个函数来实现,会有很多重复代码,且很多函数名称需要记忆。所以我们希望有个统一的入口函数,根据参数来运行不同操作。


描述

在C++里有个方法叫重载,它可以编写多个同名不同参的函数,在调用函数时会自动根据不同的参数类型调用不同函数实体。

但是在JavaScript如果有两个同名函数,后面定义的函数会覆盖前面的函数,所以不能使用重载的方式,但是在JavaScript里面为每个函数提供了内置对象 arguments,arguments对象是所有函数中都可用的局部变量。

你可以使用arguments对象在函数中引用函数的参数。此对象包含传递给函数的每个参数,第一个参数在索引0处


使用

function test(){
    console.log(arguments);         //{'0': 'ubains', '1': 6666, '2': 'hello' }
    console.log(arguments);      //'ubains'
    console.log(arguments);      //6666
    console.log(arguments);      //hello
    console.log(arguments.length);//3
    console.log(typeof arguments);//object
    console.log(typeof arguments);//string
    varargs = Array.prototype.slice.call(arguments); //转换成数组
    console.log(args); //[ 'ubains', 6666, 'hello' ]
   
}
test("ubains",6666,"hello")


定义一个 test 函数,调用时传入三个参数

打印 arguments 数据可以看出,arguments 是一个对象,arguments对象不是一个 Array 。它类似于Array,但除了length属性和索引元素之外没有任何Array属性。

因为arguments对象的key是数字,所以不能使用.写法来获取属性值,只能用 [ ]的写法来写,所有很多时候认为是一个数组,其实不是数组,是一个对象。

arguments.length 用来判断参数个数的,如果函数无参数传入时这个值是0;

通过typeof也可以看出arguments是一个对象

如果想将arguments转为数组时就需要用到 Array.prototype.slice.call(arguments) 方法去转换成数组。


写一个变参函数


下面的getConfig就是一个变参函数


function getConfig(){
    varaction = 0; //定义一个局部变量,在不同参数个数下不同值
    if(arguments.length){
      if(arguments.length == 1) {
         var name = arguments;
         //一个参数代表名字
         action = 1;
         //这里是一些逻辑代码
         return "params 1"
      }
      if(arguments.length == 2) {
         var type = arguments;
         var model = arguments;
         //两个参数代表类型和型号
         action = 2;
         //这里是一些逻辑代码
         return "params 2"
      }
      if(arguments.length == 3) {
         var logo = arguments;
         var model = arguments;
         var mode = arguments;
         //三个参数代表品牌和型号、模式
         action = 3;
         //这里是一些逻辑代码
         return "params 3"
      }
    }
    //没有参数是执行的逻辑
    //这里是一些逻辑代码
    return "params 0"
}

var answer; //不同参数代表不同意思,返回不同逻辑执行结果
answer = getConfig();       //"params 0"
answer = getConfig("EC-8000");   //"params 1"
answer = getConfig("matrix","HMX-800");   //"params 2"
answer = getConfig("ubains","AIO-1608","open");   //"params 3"









页: [1]
查看完整版本: 如何写一个变参函数