オンラインのソース コードを見て、いくつかのソース ファイルの先頭にこれを見つけました。
var FOO = FOO || {};
FOO.Bar = …;
しかし、私は何をするのか分かり|| {}
ません。
私{}
は等しいことを知っており、「すでに存在する場合はその値を使用し、そうでない場合は新しいオブジェクトを使用する」のようなものnew Object()
だと思います。||
ソース ファイルの先頭にこれが表示されるのはなぜですか?
オンラインのソース コードを見て、いくつかのソース ファイルの先頭にこれを見つけました。
var FOO = FOO || {};
FOO.Bar = …;
しかし、私は何をするのか分かり|| {}
ません。
私{}
は等しいことを知っており、「すでに存在する場合はその値を使用し、そうでない場合は新しいオブジェクトを使用する」のようなものnew Object()
だと思います。||
ソース ファイルの先頭にこれが表示されるのはなぜですか?
の意図に関するあなたの推測|| {}
はかなり近いです。
ファイルの先頭に表示されるこの特定のパターンは、名前空間、つまりグローバル オブジェクトを過度に汚染することなく関数と変数を作成できる名前付きオブジェクトを作成するために使用されます。
これが使用される理由は、 2 つ (またはそれ以上) のファイルがある場合:
var MY_NAMESPACE = MY_NAMESPACE || {};
MY_NAMESPACE.func1 = {
}
と
var MY_NAMESPACE = MY_NAMESPACE || {};
MY_NAMESPACE.func2 = {
}
どちらも同じ名前空間を共有しているため、2 つのファイルがどの順序で読み込まれるかは問題ではありません。オブジェクト内func1
でfunc2
正しく定義され、正しく取得されます。MY_NAMESPACE
最初にロードされたファイルによって初期オブジェクトが作成MY_NAMESPACE
され、その後ロードされたファイルによってオブジェクトが拡張されます。
便利なことに、これにより、同じ名前空間を共有するスクリプトの非同期読み込みも可能になり、ページの読み込み時間を改善できます。<script>
タグに属性が設定されている場合、defer
どの順序で解釈されるかがわからないため、上記のように、この問題も修正されます。
var AEROTWIST = AEROTWIST || {};
基本的に、この行は、AEROTWIST
変数を変数の値にAEROTWIST
設定するか、空のオブジェクトに設定すると言っています。
二重パイプ||
は OR ステートメントであり、OR の 2 番目の部分は、最初の部分が false を返した場合にのみ実行されます。
したがって、AEROTWIST
すでに値がある場合はその値が保持されますが、以前に設定されていない場合は空のオブジェクトとして設定されます。
これは基本的に次のように言っているのと同じです:
if(!AEROTWIST) {var AEROTWIST={};}
それが役立つことを願っています。
||のもう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') {
// ...
}
AEROTWIST に値がないか、null または未定義の場合、新しい AEROTWIST に割り当てられる値は {} (空のオブジェクト) になります。
||
演算子は次の 2 つの値を取ります。
a || b
a がtrueの場合、返されa
ます。それ以外の場合は、 を返しb
ます。
偽値はnull
、undefined
、0
、""
、NaN
およびfalse
です。真実の値は他のすべてです。
したがって、a
が設定されていない (それであるundefined
) 場合は、 が返されb
ます。
IE の一部のバージョンでは、このコードが期待どおりに機能しないことに注意してください。、var
変数が再定義されて割り当てられているため、問題を正しく思い出せば、常に新しいオブジェクトを持つことになります。これで問題が解決するはずです:
var AEROTWIST;
AEROTWIST = AEROTWIST || {};