2016-12-18 14 views
1

私は何かをさらに明確にしたかったのです。論理&&および|| JavaScriptの演算子

は、これを考慮してください

var a = 42; 
var b = "abc"; 
var c = null; 

a || b;  // 42 
a && b;  // "abc" 
c || b;  // "abc" 
c && b;  // null 

私が知っている||オペレータのための、第一オペランドにテストが真である場合、最初のオペランドの値に||式の結果(AまたはC)。テストが偽である場合、式||は第2オペランド(b)の値になります。

逆に、&&演算子の場合、テストが真の場合、&&式は第2オペランド(b)の値になります。テストがfalseの場合、&&表現最初のオペランドの値の結果(aまたはc)

だから、あなたのような値を連鎖して&&||演算子を使用する場合、正確に何が起こっているのか:

if(a && b && c && d && e){ 
    //do something; 
} 

if(a || b || c || d || e){ 
    //do something 
} 

値を連結するときに正確に何が起こっていますか?最初の例(&&演算子を含む)ではaがtrueの場合はbが正しく返されるはずですか?その時点でcやdも考慮されていますか?

+2

https://developer/ – ceejayoz

+0

最初の式では、c、d、およびeは間違いなく無視されます(aまたはbが偽であり、式が短絡していない限り)。 &&の連鎖では、戻り値は最初の偽の式、またはすべてが真実なら最終式になります。実際に何かに結果を代入していないときは、返されるかどうかについては心配する必要はありません。最初の式はa、bの場合に実行されます。 c。 d。 eはすべて真実であり、少なくとも1つが真実である限り、第2の表現が実行される。 – PMV

+0

本当に有益な応答でそれをクリアしてくれてありがとう! –

答えて

5

だからあなたは、連鎖値で&&||演算子を使用する場合、正確に何が起こっているのか

&&は1左側のオペランドと1右オペランドと、二項演算子です。

if (a && (b && (c && (d && e)))) { 

&&の意味論に基づいて、aがfalsyであれば、全体の状態がすぐにfalsyある、aと評価されます。それはこのように見えるように表現a && b && c && d && eassociativity rulesに基づいて解析されます。 aが真実である場合、式は右側に評価されます。これはb && (c && (d && e)))です。その場合、bが偽であれば、その部分式、つまり式全体が即座にbと評価されます。これは偽です。 bが真実である場合、その部分式は右側に評価され、c && (d && e)であり、処理は続行されます。

最終的な結果は、式全体が取られfalsyので、ないからifブランチのためであるために、それはfalsyする変数のいずれかで十分という直感的な動作です。偽の変数に遭遇するとすぐに、評価が「短絡」して偽物になります。表現全体が正真正銘であり、したがって分岐がとられるためには、すべての変数が真実でなければなりません。

||の場合、論理は逆になります。表現全体が真実であり、したがって、分岐がとられるためには、変数のどれかが真実であれば十分です。評価は、最初の真理値に遭遇するとすぐに、真実をもたらす「短絡」します。式全体が偽であるため、ifブランチではなく、の場合、すべての変数は偽でなければなりません。

You Don't Know JSも良い説明があります。

+0

"いいえ、通訳者はすべてが真である場合にのみすべての値を評価しなければなりません。そうでなければ、最初の偽の値で短絡します。重要な詳細を明確にする、ありがとう。それを考慮に入れて私の答えを更新しました。 –

0

値を連結するときに正確に何が起こっていますか?最初の式(& &)条件テストに合格するためにすべての値が順にtruthyでなければならない

。すべての値が真実であると仮定すると、通訳者はすべての値を評価し、条件付きテストは合格となります。それ以外の場合、最初の偽の値まで評価され、条件テストは失敗します。

2番目の式(||)では、条件付きテストが合格するためには1つの値しか真実でなければなりません。少なくとも1つの値が真実であると仮定すると、通訳者は最初の真理値まで評価し、条件付きテストは合格となります。それ以外の場合は、すべての値が評価され、条件付きテストは失敗します。