2012-03-06 8 views
8

は、誰かがこのコード行が何を私に説明することができますしてください:JavaScriptの変数のフォールバックが

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

私の最高の推測:

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

なぜかっこが使用されていますか? ||の使用に関する詳細はどこで調べることができますか?変数を設定するとき、およびこの文脈でかっこの使用?ありがとう!

+0

'||'は代入演算子 '='よりも優先度が高いため、かっこでは式の正しい評価が保証されています。括弧なしでは、 'var list =(calls [ev] || calls [ev])= {};'と評価され、エラーになります。 [MDN JavaScript reference](https://developer.mozilla.org/ja/JavaScript/Reference)はかなり包括的です。 –

+0

可能な複製[何を||オペレータdo?](http://stackoverflow.com/questions/830618/what-does-the-operator-do) –

答えて

8

このコードは、言語の機能が使用されている

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

つに相当します。

  1. ブール式のショートカット計算(a || bを検討atrueであれば、bではありません。評価される)。したがって、var v = a || b;atrueにキャストできるものに割り当てると、bは評価されません。
  2. 代入文は、( var a = b = c;を有効にするには)最後に割り当てられた値に評価

括弧は、この解釈を避けるために必要です:

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

(エラーです)。

1

||や「論理的にはOR」、これ括弧は、このイディオムは注意すべき正しい順序

他の事で評価を保証するために必要な代入演算子=よりprecedence高いしていることは、その多くの言語でありますJavascriptが含まれており、ANDやORなどのブール演算子のshort-circuit evaluationを提供します。論理の最初のオペランドが真の場合、または結果が真であると評価された場合、結果に違いがないため、2番目のオペランドを評価する必要はありません。

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

+0

便利なリンク、ありがとう。 – thugsb

5

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

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

これが機能する方法はJavaScriptで、未定義の変数は任意のブールcomparaison操作で、それはfalseに評価されることを意味し、falsyであるということです。次に、OR演算子を使用して2つの値を結合し、評価する最初の値をtrueに返します。

+0

ありがとう、私はここにその説明を探しに到着した。 – NiloVelez

1

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

括弧があるので、式は適切な順序で評価されます。

関連する問題