0

我有一个带有多个输入的函数,我希望在调用该函数时可以选择。每个输入都是不同的类型,例如字符串、数组或数字。使用这样的代码:

function doStuff(str, arr, num){
    if typeof(str) != 'undefined' { $('#stringDiv').text(str)}

    if typeof(arr) != 'undefined' {
        for(var i=0; i < arr.length; i++){
            $('<li>').text(arr[i]).appendTo('#arrayUl')
        }
    }

    if typeof(num) != 'undefined' { $('#numberDiv').text(num)}
}

jQuery(document).ready(function() {
    doStuff("i'm a string", [1,2,3,4,5], 7)
})

我可以解释我的参数可能是可选的这一事实,但不能解释这样一个事实,即如果我缺少arr,那么我的数字参数 ( num) 将排在第二位,而不是第三位。

为了解决这个问题,我还可以将我的输入转储到一个数组中,然后对数组进行排序并查找每种类型的这个,就像我在这个小提琴中所做的那样。这似乎很草率,并且根据我在其函数中看到的执行此操作的库的数量,似乎可能有更好的方法。有一个更好的方法吗?还是循环论证并寻找我最好的选择?

4

3 回答 3

0

使用一个对象

function doStuff(args) {
    // Do something with args.num
    if (typeof args.num !== "undefined") { ... }
    // Same for arr and str
}
于 2013-04-08T20:16:28.030 回答
0

您可以省略所有参数并使用arguments列表查看传递的内容。

但是,更好的方法是创建一个像这样的对象:

{
    str: "i'm a string",
    arr: [1, 2, 3, 4],
    num: 3.14
}

然后检查这些键的对象:

function doStuff(args):
    if ('str' in args) {
        $('#stringDiv').text(args.str);
    }
于 2013-04-08T20:19:32.993 回答
0

还是循环论证并寻找我最好的选择?

是的,这很好。无需对它们进行排序。此外,您可以使用类似数组的arguments对象,因此您不必args从固定数量的参数手动构建该数组。

function doStuff() {
    for (var i=0; i<arguments.length; i++) {
        var a = arguments[i];
        if (typeof a == 'string')
            $('#stringDiv').text(str);
        else if (Array.isArray(a)) // or check typeof a == 'object'
            for(var j=0; j < a.length; j++)
                $('<li>').text(a[j]).appendTo('#arrayUl');
        else if (typeof a == 'number')
            $('#numberDiv').text(num);
    }
}
于 2013-04-08T20:25:11.303 回答