先日、気になったコードの断片に出くわしましたが、実際に何をするのかよくわかりません。
options = options || {};
これまでの私の考え。存在する場合は変数options
を値options
に設定し、存在しない場合は空のオブジェクトに設定します。
はい・いいえ?
先日、気になったコードの断片に出くわしましたが、実際に何をするのかよくわかりません。
options = options || {};
これまでの私の考え。存在する場合は変数options
を値options
に設定し、存在しない場合は空のオブジェクトに設定します。
はい・いいえ?
これは、関数の引数にデフォルト値を設定するのに役立ちます。例:
function test (options) {
options = options || {};
}
test
引数なしで呼び出すoptions
と、は空のオブジェクトで初期化されます。
論理OR||
演算子は、最初のオペランドが偽の場合、2番目のオペランドを返します。
偽の値は次0
のとおりです。 null
、、、、undefined
空の文字列(""
) 、、、NaN
そしてもちろんfalse
。
ES6の更新:ES6以降、言語に実際のデフォルトのパラメーター値があります。
function test (options = {}) {
//...
}
引数なしで関数を呼び出す場合、または値を使用して明示的に呼び出される場合undefined
、options
引数はデフォルト値を取ります。演算子の例とは異なり||
、他の偽の値ではデフォルト値は使用されません。
スニペットにあるものは、 default-patternを実装する最も一般的な方法であり、ブール値に変換されたときに真の値を生成する最初のオペランドの値を返します。
var some_data = undefined;
var some_obj_1 = undefined;
var some_obj_2 = {foo: 123};
var str = some_data || "default";
var obj = some_obj1 || some_obj2 || {};
/* str == "default", obj == {foo: 123} */
上記は基本的に、次のより冗長な代替手段を実行することと同等です。
var str = undefined;
var obj = undefined;
if (some_data) str = some_data;
else str = "default";
if (some_obj1) obj = some_obj1;
else if (some_obj2) obj = some_obj2;
else obj = {};
論理OR演算子によって生成される値の例:
1 || 3 -> 1
0 || 3 -> 3
undefined || 3 -> 3
NaN || 3 -> 3
"" || "default" -> "default"
undefined || undefined -> undefined
false || true -> true
true || false -> true
null || "test" -> "test"
undefined || {} -> {}
{} || true -> {}
null || false || {} -> {}
0 || "!!" || 9 -> "!!"
ご覧のとおり、一致するものが見つからない場合、最後のオペランドの値はyieldです。
いくつかのケースがありますが、最も一般的なケースは、以下のように関数の引数のデフォルト値を設定することです。
function do_something (some_value) {
some_value = some_value || "hello world";
console.log ("saying: " + some_value);
}
...
do_something ("how ya doin'?");
do_something ();
saying: how ya doin'?
saying: hello world
これは特に、javascriptが他の多くの一般的なプログラミング言語と比較した違いの1つです。
演算子||
は暗黙的にブール値を生成しませんが、オペランドタイプを保持し、ブール式でtrueと評価される最初の型を生成します。
これが当てはまらない言語(C、C ++、PHP、Pythonなど)から来た多くのプログラマーは、これが最初はかなり混乱していると感じます。もちろん、常に反対のことがあります。javascript(perlなど)から来た人々は、なぜこの機能が他の場所に実装されていないのか疑問に思います。
はい。サンプルはこれと同等です:
if (options) {
options = options;
} else {
options = {};
}
OR演算子(||
)は短絡し、最初の真の値を返します。
はい、それはまさにそれが行うことです。
これの別のバリエーションを見つけました:
options || (options = {});
同じトリックをするようです。