javascript中的可选参数或重新排序的参数

javascript中的可选参数或重新排序的参数,javascript,Javascript,有没有简单的方法来处理基于实体的参数 我的函数取决于第二个参数还是第三个参数是函数、对象等等。这是我的职责: function fbAPI(endpoint, param1, param2, param3, param4) { var type, params, success, error; if(typeof param1 !== 'function' && typeof param2 !== 'function') { type

有没有简单的方法来处理基于实体的参数

我的函数取决于第二个参数还是第三个参数是函数、对象等等。这是我的职责:

function fbAPI(endpoint, param1, param2, param3, param4) {

    var type, params, success, error;

    if(typeof param1 !== 'function' && typeof param2 !== 'function')
    {
        type    = param1;
        params  = param2;
        success = param3;
        error   = param4;
    }

    if(typeof param1 === 'function')
    {
        type    = 'GET';
        params  = {};
        success = param1;
        error   = param2;
    }

    if(typeof param1 === 'object')
    {
        type    = 'GET';
        params  = param1;
        success = param2;
        error   = param3;
    }

    if(typeof param1 !== 'function' && typeof param2 === 'function')
    {
        type    = param1;
        params  = {};
        success = param2;
        error   = param3;
    }

    FB.api(
        endpoint,
        type,
        params,
        function (response) {

            if (response && !response.error) {
                /* handle the result */
                if(typeof success === 'function')
                    success(response);
            }

            if (response && response.error) {
                console.log(response.error);
                /* handle the result */
                if(typeof error === 'function')
                    error(response);
            }
        }
    );
}
有没有办法把它缩短

我应该可以这样调用我的函数:

    this.api(_self.endPoints.friends, function (response) {
       //do something
    });

    this.api(_self.endPoints.friends, function (response) {
       //do something
    },function (response) {
       //do something
    });

    this.api(_self.endPoints.friends, 'GET', function (response) {
       //do something
    },function (response) {
       //do something
    });

    this.api(_self.endPoints.friends, {data: data}, function (response) {
       //do something
    },function (response) {
       //do something
    });

    this.api(_self.endPoints.friends, 'GET', {data: data}, function (response) {
       //do something
    },function (response) {
       //do something
    });

也许可以尝试这样的方法,然后决定调用函数时要做什么

function example(opts) {
    // Do whatever you want with the options here
}


example({"type":"GET", "param":"[\"something\",\"here\",\"too\"]", "success":"yay", "error":"boo"});

也许可以尝试这样的方法,然后决定调用函数时要做什么

function example(opts) {
    // Do whatever you want with the options here
}


example({"type":"GET", "param":"[\"something\",\"here\",\"too\"]", "success":"yay", "error":"boo"});

你这样做有点奇怪,但是你可以用数组来做。例如:

var t = {
    // typeof param1
    'function': {
        // typeof param2
        'function': ['GET', param1, param2],
        'object': ['GET', param3, param2],
    },
    'object': {
        'function':['GET', param1, param3],
        'object': 'error',
    }
};


var r = t[typeof param1][typeof param2];

希望能有所帮助。

你这样做有点奇怪,但你可以使用数组。例如:

var t = {
    // typeof param1
    'function': {
        // typeof param2
        'function': ['GET', param1, param2],
        'object': ['GET', param3, param2],
    },
    'object': {
        'function':['GET', param1, param3],
        'object': 'error',
    }
};


var r = t[typeof param1][typeof param2];

希望有帮助。

因为您使用的是JavaScript,所以我可以避免使用多个方法来调用内部方法。这称为方法重载,这是JavaScript固有的特性,与Java或C#等其他语言不同

有几种方法可以满足你的需求,尽管你的方法很冗长。我要做的一件事是使它们成为
if
/
else if
/
else
语句,而不是所有
if
语句,这样就可以立即识别出您不能进入倍数。我也会重新排序,使它们在逻辑上流动一点

var type, params, success, error;

if(typeof param1 === 'function') {
    type    = 'GET';
    params  = {};
    success = param1;
    error   = param2;
} else if(typeof param1 === 'object') {
    type    = 'GET';
    params  = param1;
    success = param2;
    error   = param3;
} else if(typeof param1 !== 'function' && typeof param2 === 'function') {
    type    = param1;
    params  = {};
    success = param2;
    error   = param3;
} else  if(typeof param1 !== 'function' && typeof param2 !== 'function') {
    type    = param1;
    params  = param2;
    success = param3;
    error   = param4;
}
但是,您也可以使用数组来简化操作。您还可以检查数组的长度,以确保您至少拥有要查找的所有参数

function fbAPI(endpoint) {
    var type, params, success, error;

    if(typeof arguments[0] === 'function' && arguments.length === 2) {
        type    = 'GET';
        params  = {};
        success = arguments[0];
        error   = arguments[1];
    } else if(typeof param1 === 'object' && arguments.length === 3) {
        type    = 'GET';
        params  = arguments[0];
        success = arguments[1];
        error   = arguments[2];
    } else if(typeof param1 !== 'function' && typeof param2 === 'function' && arguments.length === 3) {
        type    = arguments[0];
        params  = {};
        success = arguments[1];
        error   = arguments[2];
    } else  if(typeof param1 !== 'function' && typeof param2 !== 'function' && arguments.length === 4) {
        type    = arguments[0];
        params  = arguments[1];
        success = arguments[2];
        error   = arguments[3];
    }
    // ... the rest of your function
}
最后,可能最有效的方法是将您的参数设置为对象,并让调用者设置他们想要的

function fbAPI(endpoint, settings) {
    var type = settings.type || 'GET';
    var params = settings.params || {};
    var success = settings.success;
    var error = settings.error;

    // Go about your business...
}

因为您使用的是JavaScript,所以我可以避免使用多个方法来调用内部方法。这称为方法重载,这是JavaScript固有的特性,与Java或C#等其他语言不同

有几种方法可以满足你的需求,尽管你的方法很冗长。我要做的一件事是使它们成为
if
/
else if
/
else
语句,而不是所有
if
语句,这样就可以立即识别出您不能进入倍数。我也会重新排序,使它们在逻辑上流动一点

var type, params, success, error;

if(typeof param1 === 'function') {
    type    = 'GET';
    params  = {};
    success = param1;
    error   = param2;
} else if(typeof param1 === 'object') {
    type    = 'GET';
    params  = param1;
    success = param2;
    error   = param3;
} else if(typeof param1 !== 'function' && typeof param2 === 'function') {
    type    = param1;
    params  = {};
    success = param2;
    error   = param3;
} else  if(typeof param1 !== 'function' && typeof param2 !== 'function') {
    type    = param1;
    params  = param2;
    success = param3;
    error   = param4;
}
但是,您也可以使用数组来简化操作。您还可以检查数组的长度,以确保您至少拥有要查找的所有参数

function fbAPI(endpoint) {
    var type, params, success, error;

    if(typeof arguments[0] === 'function' && arguments.length === 2) {
        type    = 'GET';
        params  = {};
        success = arguments[0];
        error   = arguments[1];
    } else if(typeof param1 === 'object' && arguments.length === 3) {
        type    = 'GET';
        params  = arguments[0];
        success = arguments[1];
        error   = arguments[2];
    } else if(typeof param1 !== 'function' && typeof param2 === 'function' && arguments.length === 3) {
        type    = arguments[0];
        params  = {};
        success = arguments[1];
        error   = arguments[2];
    } else  if(typeof param1 !== 'function' && typeof param2 !== 'function' && arguments.length === 4) {
        type    = arguments[0];
        params  = arguments[1];
        success = arguments[2];
        error   = arguments[3];
    }
    // ... the rest of your function
}
最后,可能最有效的方法是将您的参数设置为对象,并让调用者设置他们想要的

function fbAPI(endpoint, settings) {
    var type = settings.type || 'GET';
    var params = settings.params || {};
    var success = settings.success;
    var error = settings.error;

    // Go about your business...
}

有很多方法可以解决这些问题,可以找到以下三种方法:

//解构分配
函数test1Fun({name,val}){
console.log(名称,val);
}
//扩展参数处理
函数test2Fun(…参数){
控制台日志(参数长度);
console.log(参数[0]);
console.log(参数[1]);
console.log(参数[2]);
}
//关键值
函数test3Fun(选项){
console.log(options.name);
}
var选项={name:“bar”,val:42};
test1Fun(选项);
test2Fun(1,2,3,4,5);

test3Fun(选项)有很多方法可以解决这些问题,可以找到以下三种方法:

//解构分配
函数test1Fun({name,val}){
console.log(名称,val);
}
//扩展参数处理
函数test2Fun(…参数){
控制台日志(参数长度);
console.log(参数[0]);
console.log(参数[1]);
console.log(参数[2]);
}
//关键值
函数test3Fun(选项){
console.log(options.name);
}
var选项={name:“bar”,val:42};
test1Fun(选项);
test2Fun(1,2,3,4,5);

test3Fun(选项)不要设计这种类型的函数签名。这是一个需要处理的噩梦,最终也会让你的用户感到困惑。您还将遇到异常情况,
fbAPI(端点“GET”、成功、错误)
失败,因为您没有想到在给定类型的情况下默认
params

如果您坚持,那么如果您将参数视为一个数组,将其从前面移开,则会更容易:

function fbAPI(endpoint, ...args) {

    var 
      type    = typeof args[0] === 'string' ? args.shift() : 'GET', 
      params  = typeof args[0] === 'object' ? args.shift() : {},
      success = args.shift(),
      error   = args.shift();

不要设计这种类型的函数签名。这是一个需要处理的噩梦,最终也会让你的用户感到困惑。您还将遇到异常情况,
fbAPI(端点“GET”、成功、错误)
失败,因为您没有想到在给定类型的情况下默认
params

如果您坚持,那么如果您将参数视为一个数组,将其从前面移开,则会更容易:

function fbAPI(endpoint, ...args) {

    var 
      type    = typeof args[0] === 'string' ? args.shift() : 'GET', 
      params  = typeof args[0] === 'object' ? args.shift() : {},
      success = args.shift(),
      error   = args.shift();

我能想到的唯一缩短它的方法是以一种合理的方式存储数据考虑使用一个所有参数都固定的主函数和一些支持函数将可能性转换为主函数。不确定您的代码是否会遇到这种情况,但是如果param1和param2都是函数会发生什么呢?@Al.G。你能给我举个小例子吗?我不确定我是否完全理解。Loaf如果param1是函数,则param2可以为null或自动为函数。我用cases更新了代码。不要设计这种类型的函数签名。这是一个需要处理的噩梦,最终也会让你的用户感到困惑。如果您曾经将此代码移植到类型化环境,如TypeScript,也不可能为编写键入的签名。我能想到的唯一缩短签名的方法是以合理的方式存储数据考虑使用一个所有参数固定的主函数和一些支持函数将可能性转换为主函数。不确定您的代码是否会遇到这种情况,但是如果param1和param2都是函数会发生什么呢?@Al.G。你能给我举个小例子吗?我不确定我是否完全理解。Loaf如果param1是函数,则param2可以为null或自动为函数。我用cases更新了代码。不要设计这种类型的函数签名。这是一个需要处理的噩梦,最终也会让你的用户感到困惑。如果您曾经将此代码移植到类型化环境(如T