二重パイプ演算子(||)とは何ですか?
二重パイプ演算子(||)は論理OR演算子です。でほとんどの言語は、次のように動作します:
- 最初の値がの場合、
false2番目の値をチェックします。の場合trueは戻りtrue、の場合falseはを戻しますfalse。
- 最初の値がの場合、2番目の値が何であっても、
true常にを返しますtrue。
したがって、基本的には次の関数のように機能します。
function or(x, y) {
if (x) {
return true;
} else if (y) {
return true;
} else {
return false;
}
}
それでも理解できない場合は、次の表をご覧ください。
| true false
------+---------------
true | true true
false | true false
つまり、両方の値がfalseの場合にのみfalseになります。
JavaScriptの違いは何ですか?
JavaScriptは緩やかに型付けされた言語であるため、少し異なります。この場合、||ブール値ではない値で演算子を使用できることを意味します。意味がありませんが、この演算子を関数やオブジェクトなどで使用できます。
(function(){}) || {}
そこで何が起こりますか?
値がブール値でない場合、JavaScriptは暗黙的にブール値に変換します。これは、値が(例えばfalseyであればということを意味0、""、null、undefined(も参照のJavaScriptですべてのfalsey値を))、それはとして扱われますfalse。それ以外の場合はとして扱われtrueます。
true空の関数は真実なので、上記の例はを与えるはずです。まあ、そうではありません。空の関数を返します。||最初に書いたようにJavaScriptの演算子が機能しないためです。次のように機能します。
- 最初の値がfalseの場合、2番目の値を返します。
- 最初の値が真である場合、最初の値を返します。
驚いた?実際には、従来の||演算子と「互換性があります」。次の関数として書くことができます:
function or(x, y) {
if (x) {
return x;
} else {
return y;
}
}
真の値をとして渡すと、真の値をx返しxます。したがって、後でif句で使用する場合:
(function(x, y) {
var eitherXorY = x || y;
if (eitherXorY) {
console.log("Either x or y is truthy.");
} else {
console.log("Neither x nor y is truthy");
}
}(true/*, undefined*/));
あなたが得る"Either x or y is truthy."。
もしx偽りだったら、eitherXorYだろうy。この場合、あなたは"Either x or y is truthy."if yが真実であることを得るでしょう。そうでなければあなたは得るでしょう"Neither x nor y is truthy"。
実際の質問
さて、||演算子がどのように機能するかを知っていれば、おそらく自分で何がx = x || y意味するのかを理解できます。xが真実の場合、xに割り当てられるためx、実際には何も起こりません。それ以外の場合yはに割り当てられxます。これは通常、関数のデフォルトパラメータを定義するために使用されます。しかし、しばしば考えられている悪いプログラミングの練習、それはfalsey値を渡してからあなたを防ぐため、(必ずしもされていない、undefinedまたはnullパラメータとして)。次の例を検討してください。
function badFunction(/* boolean */flagA) {
flagA = flagA || true;
console.log("flagA is set to " + (flagA ? "true" : "false"));
}
一見有効に見えます。ただし、パラメーターfalseとして渡した場合はどうなりますかflagA(ブール値であるため、trueまたはにすることができますfalse)?なるでしょうtrue。この例では、に設定flagAする方法はありませんfalse。
明示的かどうかを確認するために良いアイデアだろうflagAであるundefinedことのように、:
function goodFunction(/* boolean */flagA) {
flagA = typeof flagA !== "undefined" ? flagA : true;
console.log("flagA is set to " + (flagA ? "true" : "false"));
}
長いですが、常に機能し、理解しやすくなっています。
ES6構文をデフォルトの関数パラメーターに使用することもできますが、それは古いブラウザー(IEなど)では機能しないことに注意してください。これらのブラウザーをサポートする場合は、コードをBabelでトランスパイルする必要があります。
MDNの論理演算子も参照してください。
falsyJUSTではなくの場合、2番目の値が選択されるという事実に非常に注意してundefinedください。私が見た回数doWeDoIt = doWeDoIt || trueは、私を泣かせるのに十分です。(つまり、doWeDoIt今は決してならないfalse)