42

先日、気になったコードの断片に出くわしましたが、実際に何をするのかよくわかりません。

options = options || {};

これまでの私の考え。存在する場合は変数optionsを値optionsに設定し、存在しない場合は空のオブジェクトに設定します。

はい・いいえ?

4

5 に答える 5

52

これは、関数の引数にデフォルト値を設定するのに役立ちます。例:

function test (options) {
  options = options || {};
}

test引数なしで呼び出すoptionsと、は空のオブジェクトで初期化されます。

論理OR||演算子は、最初のオペランドが偽の場合、2番目のオペランドを返します

偽の値は次0のとおりです。 null、、、、undefined空の文字列("") 、、、NaNそしてもちろんfalse

ES6の更新:ES6以降、言語に実際のデフォルトのパラメーター値があります。

function test (options = {}) {
  //...
}

引数なしで関数を呼び出す場合、または値を使用して明示的に呼び出される場合undefinedoptions引数はデフォルト値を取ります。演算子の例とは異なり||、他の偽の値ではデフォルト値は使用されません。

于 2010-05-17T17:51:06.550 に答える
14

これがデフォルトのパターンです。

スニペットにあるものは、 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など)から来た多くのプログラマーは、これが最初はかなり混乱していると感じます。もちろん、常に反対のことがあります。javascriptperlなど)から来た人々は、なぜこの機能が他の場所に実装されていないのか疑問に思います。

于 2012-07-19T03:31:15.957 に答える
10

はい。サンプルはこれと同等です:

if (options) {
    options = options;
} else {
    options = {};
}

OR演算子(||)は短絡し、最初の真の値を返します。

于 2010-05-17T17:51:43.123 に答える
6

はい、それはまさにそれが行うことです。

于 2010-05-17T17:51:10.260 に答える
4

これの別のバリエーションを見つけました:

options || (options = {});

同じトリックをするようです。

于 2013-01-24T14:37:38.727 に答える