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進数です。それ以外の場合は返されます NaNexpr1「truthy」値、実行時間を返してexpr2 (そうでない場合は、私のように停止したいNaNfalsyです)userinputtruthy(番号)ですが、私は追加することができ+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 です falseexpr1 です true || falseこれがトリッキーな部分だったので、true || false評価されます(expr1-の左側&&)。
||ならば、オペレータは実行を停止するexpr1 || expr2にexpr1truthyとして評価し、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)として追加しました。