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';
...
}
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をご覧ください。
この方法は、false
、null
、undefined
、0
、""
などの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" });