102

オンラインのソース コードを見て、いくつかのソース ファイルの先頭にこれを見つけました。

var FOO = FOO || {};
FOO.Bar = …;

しかし、私は何をするのか分かり|| {}ません。

{}は等しいことを知っており、「すでに存在する場合はその値を使用し、そうでない場合は新しいオブジェクトを使用する」のようなものnew Object()だと思います。||

ソース ファイルの先頭にこれが表示されるのはなぜですか?

4

8 に答える 8

155

の意図に関するあなたの推測|| {}はかなり近いです。

ファイルの先頭に表示されるこの特定のパターンは、名前空間、つまりグローバル オブジェクトを過度に汚染することなく関数と変数を作成できる名前付きオブジェクトを作成するために使用されます。

これが使用される理由は 2 つ (またはそれ以上) のファイルがある場合:

var MY_NAMESPACE = MY_NAMESPACE || {};
MY_NAMESPACE.func1 = {
}

var MY_NAMESPACE = MY_NAMESPACE || {};
MY_NAMESPACE.func2 = {
}

どちらも同じ名前空間を共有しているため、2 つのファイルがどの順序で読み込まれるかは問題ではありません。オブジェクト内func1func2正しく定義され、正しく取得されます。MY_NAMESPACE

最初にロードされたファイルによって初期オブジェクトが作成MY_NAMESPACEされ、その後ロードされたファイルによってオブジェクトが拡張されます。

便利なことに、これにより、同じ名前空間を共有するスクリプトの非同期読み込みも可能になり、ページの読み込み時間を改善できます。<script>タグに属性が設定されている場合、deferどの順序で解釈されるかがわからないため、上記のように、この問題も修正されます。

于 2011-06-22T12:15:47.570 に答える
25
var AEROTWIST = AEROTWIST || {};

基本的に、この行は、AEROTWIST変数を変数の値にAEROTWIST設定するか、空のオブジェクトに設定すると言っています。

二重パイプ||は OR ステートメントであり、OR の 2 番目の部分は、最初の部分が false を返した場合にのみ実行されます。

したがって、AEROTWISTすでに値がある場合はその値が保持されますが、以前に設定されていない場合は空のオブジェクトとして設定されます。

これは基本的に次のように言っているのと同じです:

if(!AEROTWIST) {var AEROTWIST={};}

それが役立つことを願っています。

于 2011-06-22T12:15:09.380 に答える
7

||のもう1つの一般的な使用法 未定義の関数パラメータのデフォルト値も設定します。

function display(a) {
  a = a || 'default'; // here we set the default value of a to be 'default'
  console.log(a);
}

// we call display without providing a parameter
display(); // this will log 'default'
display('test'); // this will log 'test' to the console

他のプログラミングでの同等物は通常次のとおりです。

function display(a = 'default') {
  // ...
}
于 2011-11-18T16:57:08.157 に答える
3

AEROTWIST に値がないか、null または未定義の場合、新しい AEROTWIST に割り当てられる値は {} (空のオブジェクト) になります。

于 2011-06-22T12:13:07.207 に答える
1

||演算子は次の 2 つの値を取ります。

a || b

a がtrueの場合、返されaます。それ以外の場合は、 を返しbます。

偽値はnullundefined0""NaNおよびfalseです。真実の値は他のすべてです。

したがって、aが設定されていない (それであるundefined) 場合は、 が返されbます。

于 2011-06-22T12:15:00.690 に答える
-1

IE の一部のバージョンでは、このコードが期待どおりに機能しないことに注意してください。、var変数が再定義され割り当てられているため、問題を正しく思い出せば、常に新しいオブジェクトを持つことになります。これで問題が解決するはずです:

var AEROTWIST;
AEROTWIST = AEROTWIST || {};
于 2012-03-14T12:21:19.720 に答える