17

誰かがこのコード行が何をするのか説明してくれませんか:

var list  = calls[ev] || (calls[ev] = {});

私の最善の推測:

変数「list」に、calls.xxx の値を設定しています。ここで、xxx は変数です。呼び出し[ev]が存在しない場合は、それを空のオブジェクトとして作成し、その空のオブジェクトを「リスト」に割り当てています。そうですか?

なぜ括弧が使われているのですか?|| の使用に関する詳細情報はどこで入手できますか? 変数を設定するとき、およびこのコンテキストでの括弧の使用は? ありがとう!

4

4 に答える 4

16

このコードは次と同等です

var list;
if (calls[ev])
  list = calls[ev];
else {
  calls[ev] = {};
  list = calls[ev];
}

言語の 2 つの機能が使用されます。

  1. ブール式のショートカットa || b計算 ( を考慮してください。 If ais truethenbは評価されません)。したがって、にキャストできるものに代入var v = a || b;して評価すると、は評価されません。atrueb
  2. 割り当てステートメントは、最後に割り当てられた値に評価されます (を有効にするためvar a = b = c;)

この解釈を避けるために括弧が必要です。

var list = (calls[ev] || calls[ev]) = {};

(これはエラーです)。

于 2012-03-06T15:14:41.987 に答える
11

あなたの推測は正しいです。これは、JavaScriptで変数の「デフォルト」値を宣言する一般的な方法です。

function foo(bar) {
    var bar = bar || 0; //This sets bar to 0 if it's not already set
    console.log(bar);
}

これが機能する方法は、JavaScriptでは、未定義の変数が偽であるということです。つまり、ブール値の比較操作では、に評価されfalseます。次に、OR演算子を使用して2つの値を組み合わせると、に評価される最初の値が返されtrueます。

于 2012-03-06T15:11:51.210 に答える
4

||または「論理OR」は代入演算子よりも優先順位=が高いため、このイディオムが正しい順序で評価されるようにするには、括弧が必要です。

注意すべきもう1つの点は、Javascriptを含む多くの言語が、ANDやORなどのブール演算子の短絡評価を提供することです。論理和の最初のオペランドがtrueと評価された場合、結果に違いがないため、2番目のオペランドを評価する必要はありません。

これを理解すると、これは特別な割り当て構文ではなく、言語機能を利用してアイデアのよりコンパクトな表現を提供するイディオムまたはパターンであることがわかります。

于 2012-03-06T15:11:13.387 に答える
1

あなたの最初の推測は正しいです。これは、javascript 名前空間を初期化するための一般的なパターンです。同じ名前の以前のオブジェクトを上書きしないようにするのに役立ちます。ほとんどの一般的なライブラリは、名前空間オブジェクトを作成するために同様のことを行います。

括弧は、式が適切な順序で評価されるようにするためのものです。

于 2012-03-06T15:16:32.433 に答える