如何写一个变参函数
本帖最后由 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]