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) が 3 番目ではなく 2 番目になるという事実は説明できません。

これを回避するために、入力を配列にダンプし、配列を並べ替えて、このフィドルで行うように、各タイプのこれを探すこともできます。これはずさんなように思えます。私が見たライブラリの関数でこれを行うライブラリの数に基づいて、おそらくもっと良い方法があるようです。これを行うより良い方法はありますか?それとも、引数をループして型を探すのが私の最善の策ですか?

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オブジェクト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 に答える
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 に答える