JavaScriptの関数にデフォルトのパラメータ値を設定する

JavaScriptの関数に、デフォルトを設定したオプションの引数を持たせ、その値が定義されていない場合には使用される(値が渡された場合には無視される)ようにしたいと考えています。Rubyでは次のようにできます。

def read_file(file, delete_after = false)
  # code
end

これはJavaScriptでも使えますか?

function read_file(file, delete_after = false) {
  // Code
}
ソリューション

ES6/ES2015]1より、デフォルトのパラメータは言語仕様にあります。

function read_file(file, delete_after = false) {
  // Code
}

がちょうど動作します。

参考にしてください。Default Parameters - MDNを参照してください。

デフォルトの関数パラメータは、no valueまたはundefinedが渡された場合に、形式パラメータをデフォルト値で初期化することができます。

また、destructuringによるデフォルトの名前付きパラメータをシミュレートすることもできます。

// the `= {}` below lets you call the function without any parameters
function myFor({ start = 5, end = 1, step = -1 } = {}) { // (A)
    // Use the variables `start`, `end` and `step` here
    ···
}

ES2015以前

いろいろな方法がありますが、私はこの方法を気に入っています。(typeof null == "object")

function foo(a, b) {
  a = typeof a !== 'undefined' ? a : 42;
  b = typeof b !== 'undefined' ? b : 'default_b';
  ...
}
解説 (26)
function read_file(file, delete_after) {
    delete_after = delete_after || "my default here";
    //rest of code
}

これは、delete_afterの値がfalseでなければdelete_afterの値を、そうでなければ文字列"my default here"を、delete_afterに割り当てます。詳しくは、Doug Crockford's survey of the language and check out the section on Operatorsをご覧ください。

この方法は、falsenullundefined0""などのfalseyな値を渡したい場合には使えません。もしfalseyな値を渡したい場合は、[Tom Ritter's answer][2]の方法を使う必要があります。

関数のパラメータを多数扱う場合、コンシューマがパラメータ引数をオブジェクトで渡し、その値を関数のデフォルト値を含むオブジェクトに merge することができると便利な場合があります。

function read_file(values) {
    values = merge({ 
        delete_after : "my default here"
    }, values || {});

    // rest of code
}

// simple implementation based on $.extend() from jQuery
function merge() {
    var obj, name, copy,
        target = arguments[0] || {},
        i = 1,
        length = arguments.length;

    for (; i < length; i++) {
        if ((obj = arguments[i]) != null) {
            for (name in obj) {
                copy = obj[name];

                if (target === copy) {
                    continue;
                }
                else if (copy !== undefined) {
                    target[name] = copy;
                }
            }
        }
    }

    return target;
};

を使用します。

// will use the default delete_after value
read_file({ file: "my file" }); 

// will override default delete_after value
read_file({ file: "my file", delete_after: "my value" }); 

[2]: https://stackoverflow.com/questions/894860/how-do-i-make-a-default-value-for-a-parameter-to-a-javascript-function/894877#894877

解説 (17)

このようなシンプルなものの方が、個人的にはずっと簡潔で読みやすいと思います。

function pick(arg, def) {
   return (typeof arg == 'undefined' ? def : arg);
}

function myFunc(x) {
  x = pick(x, 'my default');
} 
解説 (7)