3

デフォルトパラメータを設定する2つの方法を知っていますが、推奨される方法を知りたいです。

function Foo(par1, par2)
{
    if(par2 == null)
        par2 = "my default"
}

また

function Foo(par1, par2)
{
    par2 = par2 || "my default"
}

またはこれらのいずれかよりも良い方法はありますか?

編集:

また、他の人がこのような複数のオプションのパラメーターをどのように処理するかを知りたいです。内部ライブラリにはこのような関数がいくつかあります(かなり醜いと思います)。

function Foo(par1, par2, par3)
{
    if(par2 == null)
        par2 = "my default"
    if(par3 == null)
        par3 = "my default"
    // Do something
}

そしてそれを呼ぶために:

Foo("Parameter one",null,true)
4

11 に答える 11

5

最初の 1 つは実際には間違っています。これらは未定義で null ではないからです。

par2 !== nullこの場合は true を返します。

JavaScript は、大まかに比較すると、null、undefined、false を同じ値と比較するため、未定義の値を明示的にチェックすることをお勧めします。

if (par2 !== 未定義)
        par2 = "私のデフォルト";

また

    par2 = par2 !== 未定義 ? par2 : "私のデフォルト";

これにより、false や null などの値を渡すことができます。

ただし、2 番目のアプローチは便利ですが、false または null を渡さないことがわかっている場合に限ります。

于 2009-01-20T14:16:19.127 に答える
4

より優れた信頼性の高いアプローチは次のとおりです。

1)渡された引数の量を確認し(DOMのinsertBefore関数の場合のように、未定義の値またはnullを渡すことを許可したいと想像してください)、省略された場合にのみ値を設定してみてください:

関数 Foo(par1, par2)
{
    if (arguments.length < 2)
        par2 = "私のデフォルト"
    そうしないと
    if (arguments.length < 3)
        par3 = "私のデフォルト"
}

2) または、undefined の受け渡しを許可しない場合は、それを構造に含めます。

関数 Foo(par1, par2)
{
    if (arguments.length < 2 && par2 === 未定義)
        par2 = "私のデフォルト"
    そうしないと
    if (arguments.length < 3 && par3 === 未定義)
        par3 = "私のデフォルト"

}

3) または、null の受け渡しを禁止する場合は、構造に含めます。

関数 Foo(par1, par2)
{
    if (arguments.length < 2 && (par2 === 未定義 || par2 === null))
        par2 = "私のデフォルト"
    そうしないと
    if (arguments.length < 3 && (par3 === 未定義 || par3 === null))
        par4 = "私のデフォルト"
}

ところで: 関数のオーバーロードの使用を避けることをお勧めしますが、実際にはほとんど必要ありません。

于 2009-01-20T14:16:52.963 に答える
3

信号の追加が少ないため、通常は2番目のものを使用します。

于 2009-01-20T14:10:28.433 に答える
2

これはどうですか:

function myFunc(arg1, arg2, arg3) {
    switch (arguments.length) {
        case 0 : arg1 = "default1";
        case 1 : arg2 = "default2";
        case 2 : arg3 = "default3";
    }
}
于 2009-01-21T10:57:54.453 に答える
2

個人的には、2 番目の形式は完全にクリーンで読みやすいと思います。確かに sergey の引数の検査よりも優れていると思いますが、その場所はあるかもしれませんが、引数の署名を維持する必要があるよりも、拡張可能なオブジェクトを引数に渡すことを好みます。

例えば

function Foo(myArgs)
{
    myArgs.par1 = myArgs.par1 || "my default"
    myArgs.par2 = myArgs.par2 || "my default"
}
于 2009-01-20T14:33:41.507 に答える
1

同様の質問や関連する質問が以前にも寄せられています。

于 2009-01-20T14:16:25.600 に答える
1

私が行う選択は、パラメーターのタイプと必要なデフォルト値によって異なります。

たとえば、par2 が false、0、空の文字列、null、または未定義の場合、これは「デフォルト値」を割り当てます。

par2 = par2 || 'default value';

その動作は、期待または必要とされていない可能性があります。

于 2009-01-20T14:17:00.903 に答える
0

あなたが言った2番目の方法を聞いたことがない、それは興味深い。私はします:

function Foo(par1, par2)
{
    par2 = par2 ? par2 : 'default value';
}

しかし、2番目の方法に注意を向けたので、タイピングが少ないという理由だけでそれを使用すると思います。

于 2009-01-20T14:10:29.747 に答える
0

のソリューションを使用するときに考えなければならないことの1つは、

var foo = バー || 123;

false と評価される bar の値です。途中で問題が発生する可能性があります。

エリック

于 2009-01-20T15:05:29.230 に答える
0

関数に多くの引数を渡す場合は、次のようにすることができます。

function myFunc() {
    arguments[0] = arguments[0] || "default value for first argument";
    arguments[3] = arguments[3] || "default value for fourth argument";
    alert(arguments[3]);
}
于 2009-01-20T15:06:07.980 に答える
0

jquery を使用する場合は、次のことができます。

function foo(params){
 var params = $.extend({}, {bar: '2'}, params);
 alert(params.bar);
}
foo(); //Alerts 2
于 2009-01-20T14:14:04.620 に答える