0

次の非常に単純なコード ブロックがあるとします。

<script>
function hasVal(field) {
    console.log(field);
    var ret = false;

    return ret;
}

if(hasVal('#field1') && hasVal('#field2')) {
    console.log('here');
}else {
    console.log('there');
}
</script>

私はそれが次のように出力されることを期待していました:

#field1
#field2
there

実際に出力されるのは次のとおりです。

#field1
there

誰かがここで何が起こっているのか説明してもらえますか?

Javascript は、最初の関数呼び出しから戻るifとすぐに残りのステートメントの評価を停止しますか?false

4

2 に答える 2

5

&&and演算子には短絡||動作と呼ばれることがあるため、オペランドが になるとすぐに の評価が停止します。&&false

同様に、 の評価は||、オペランドが になるとすぐに終了しtrueます。

これは通常、プログラマーにとって非常に大きなメリットですが、完全な評価が必要な場合はまれです (ほとんどの場合、例の副作用のように重大なコードの匂いがします)。そのためには、単純なブール値&andを使用する|か、式を明示的に別々のステートメントに分解することができます。

これが非常に優れている理由は、プロパティにアクセスする前に何かがあるnull(または利用できない)かどうかを確認する必要があるという非常に一般的なケースで見ることができます。

if (something != null && something.whatever == 17) {
  ...
}

&&常に表現の両面を評価しているとしたら、そのイディオムは機能せず、ソフトウェア開発者としての私たちの生活はさらに地獄になります。

于 2012-06-27T20:20:28.807 に答える
2

の 2 番目の条件がif実行されないためです。左条件と右条件の両方&&を機能させるには、真の値に解決する必要があります。インタプリタは、最初の条件がであることを認識し、2 番目の条件は真実ではなかったため、すぐにスキップします。false

于 2012-06-27T20:20:45.717 に答える