JavaScriptにC&Cの&&演算子のような「短絡」評価があるかどうか知りたいのですが。そうでない場合は、採用する意味のある回避策があるかどうかを知りたいです。
JavaScriptにC&Cの&&演算子のような「短絡」評価があるかどうか知りたいのですが。そうでない場合は、採用する意味のある回避策があるかどうかを知りたいです。
回答:
はい、JavaScriptには「短絡」評価があります。
if (true == true || foo.foo){
// Passes, no errors because foo isn't defined.
}
if (false && foo.foo){
// Passes, no errors because foo isn't defined.
}
Short-circuit
その論理演算子を使用することはできません。自分で試してみてください。私のデモを使用してください。
この答えは、 短絡JavaScriptで動作し、すべての落とし穴や演算子の優先順位などの関連テーマも含まれます。簡単な定義を探していて、短絡がどのように機能するかをすでに理解している場合は、他の回答を確認することをお勧めします。
最初に、if()
ブロック内で慣れ親しんでいる動作を調べて&&
、2つの要素があるかどうかを確認しますtrue
。
if (true && true) {
console.log('bar');
}
:今、あなたの最初の本能は言っておそらく「ああ、はい、非常に簡単、コードが両方のif文を実行expr1
し、expr2
として評価されていますtrue
」
まあ、はい、いいえ。あなたは技術的に正しいです、それはあなたが説明した振る舞いですが、それは正確にコードが評価される方法ではなく、完全に理解するためにさらに深く掘り下げる必要があります。
&&
と||
解釈は?:「のフードの下で見る時が来ました JavaScript エンジン」。この実用的な例を考えてみましょう:
function sanitise(x) {
if (isNaN(x)) {
return NaN;
}
return x;
}
let userinput = 0xFF; // as an example
const res = sanitise(userinput) && userinput + 5
console.log(res);
まあ結果は260
..ですが、なぜですか?答えを得るには、短絡評価の仕組みを理解する必要があります。
MDN定義により、 の
&&
演算子expr1 && expr2
は次のように実行されます。
expr1
に変換できる場合はをtrue
返しますexpr2
。それ以外の場合はを返しますexpr1
。
つまり、これは、実際の例でconst res
は、次のように評価されることを意味します。
expr1
-sanitise(0xFF)
0xFF
250の有効な16進数です。それ以外の場合は返されます NaN
expr1
「truthy」値、実行時間を返してexpr2
(そうでない場合は、私のように停止したいNaN
falsyです)userinput
truthy(番号)ですが、私は追加することができ+5
、それにそのため、ここでは、オペレーターを使用するだけで、追加のif
ブロックを回避し、さらにisNaN
チェックすることができました&&
。
今までに、少なくともどのように 短絡演算子が動作します。普遍的なルールは次のとおりです。
(some falsy expression) && expr
偽の表現に評価されます(some truthy expression) || expr
真実の表現に評価されます以下に、理解を深めるための例をいくつか示します。
function a() { console.log('a'); return false; }
function b() { console.log('b'); return true; }
if ( a() && b() ){
console.log('foobar');
}
//Evaluates a() as false, stops execution.
function a() { console.log('a'); return false; }
function b() { console.log('b'); return true; }
if ( a() || b() ){
console.log('foobar');
}
/* 1. Evaluates a() as false
2. So it should execute expr2, which is `b()`
3. b() returned as true, executing statement `console.log('foobar');`
*/
いいですね、うまくいけば、コツをつかむことができます!最後に知っておく必要があるのは、演算子の優先順位に関する規則です。
&&
オペレータは、常に前に実行される||
演算子。次の例について考えてみます。
function a() { console.log('a'); return true;}
function b() { console.log('b'); return false;}
function c() { console.log('c'); return false;}
console.log(a() || b() && c());
// returns a() and stops execution
これは、おそらく混乱するように、に戻りa()
ます。理由は非常に単純です。左から右に読むことに慣れているため、私たちをだましているのは私たちの視力だけです。console.log()
外に出ていないものを取り、純粋に評価に集中しましょう
true || false && false
これで頭を包みます:
私たちは言った&&
、オペレータが優先され、それが最初のように評価されます。評価をよりよく想像するために、定義を考えてください
expr1 && expr2
どこ:
expr2
です false
expr1
です true || false
これがトリッキーな部分だったので、true || false
評価されます(expr1
-の左側&&
)。
||
ならば、オペレータは実行を停止するexpr1 || expr2
にexpr1
truthyとして評価し、expr1
実行され、コードの実行が停止されます。戻り値は true
まあ..いくつかの奇妙なルールとセマンティクスのために、それはかなりトリッキーでした。しかし、覚えておいてください()
- 数学のように、演算子の優先順位はいつでもエスケープできます-
function a() { console.log('a'); return true;}
function b() { console.log('b'); return false;}
function c() { console.log('c'); return false;}
console.log((a() || b()) && c());
/* 1. The () escape && operator precedence
2. a() is evaluated as false, so expr2 (c()) to be executed
3. c()
*/
expr1
とexpr2
かcondition1
または何でも、ちょうど混乱しています。たとえば、ローカル変数を導入することもできます。const expr1 = true; if(expr1 && ...)
https://www.google.com/search?q=site:stackoverflow.com+%s
検索を高速化するために、検索ショートカット(Chrome / Firefox)として追加しました。