web-dev-qa-db-ja.com

JavaScriptでオプションの関数パラメーターをスキップする

JavaScriptでオプションのパラメーターをスキップする素敵な方法を教えてください。

たとえば、すべてのopt_パラメータは次のとおりです。

goog.net.XhrIo.send(url, opt_callback, opt_method, opt_content, {'Cache-Control': 'no-cache'}, opt_timeoutInterval)
51
Dan

溶液:

goog.net.XhrIo.send(url, undefined, undefined, undefined, {'Cache-Control': 'no-cache'})

スキップするオプションのパラメーターの代わりにundefinedを使用する必要があります。これは、JavaScriptのオプションのパラメーターのデフォルト値を100%シミュレートするためです。

小さな例:

myfunc(param);

//is equivalent to

myfunc(param, undefined, undefined, undefined);

強力な推奨事項:多数のパラメーターがあり、パラメーターリストの中央にオプションのパラメーターがある場合はJSONを使用します。 jQuery でこれがどのように行われるかを見てください。

102
Dan

短い答え

最も安全な賭けはundefinedであり、ほぼ遍在的に機能するはずです。しかし、最終的には、呼び出されている関数をだましてパラメーターを本当に省略したと考えることはできません。

短いという理由だけでnullを使用する傾向がある場合は、undefinedのニースの短縮形として___という名前の変数を宣言することを検討してください。

_(function() { // First line of every script file
    "use strict";
    var _ = undefined; // For shorthand
    // ...
    aFunction(a, _, c);
    // ...
})(); // Last line of every script
_

詳細

まず、次のことを知ってください。

  • _typeof undefined_は_"undefined"_に評価されます
  • _typeof null_は_"object"_に評価されます

したがって、関数が_"number"_型であると予想される引数を取ると仮定します。 nullを値として指定すると、_"object"_が与えられます。セマンティクスはオフです。1

開発者がますます堅牢なJavaScriptコードを記述し続けると、従来のif (aParam) {...}とは対照的に、undefinedのパラメーター値を明示的にチェックする関数が呼び出される可能性が高まります。両方がnullに強制的に変換されるという理由だけで、undefinedfalseを互換的に使用し続けると、不安定な状態になります。

ただし、パラメータが実際に省略されたかどうかを関数が知ることが実際に可能であることに注意してください(undefinedに設定されている場合)。

_f(undefined); // Second param omitted
function f(a, b) {
    // Both a and b will evaluate to undefined when used in an expression
    console.log(a); // undefined
    console.log(b); // undefined
    // But...
    console.log("0" in arguments); // true
    console.log("1" in arguments); // false
}
_

脚注

  1. undefinedも_"number"_型ではありませんが、実際には型ではない型になることが全体の仕事です。それが、初期化されていない変数によって想定される値であり、関数のデフォルトの戻り値である理由です。
27
Doug Paul

パラメーター値としてnullを渡すだけです。

追加:最後に実際の値を渡したいと思われるオプションパラメータをスキップすることもできます(この場合、opt_timeoutIntervalパラメータ)

5