二重パイプ演算子(||
)とは何ですか?
二重パイプ演算子(||
)は論理OR
演算子です。でほとんどの言語は、次のように動作します:
- 最初の値がの場合、
false
2番目の値をチェックします。の場合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の論理演算子も参照してください。
falsy
JUSTではなくの場合、2番目の値が選択されるという事実に非常に注意してundefined
ください。私が見た回数doWeDoIt = doWeDoIt || true
は、私を泣かせるのに十分です。(つまり、doWeDoIt
今は決してならないfalse
)