2

私は最近、次のように null / undefined を評価していた JavaScript を見つけました。

// The single & is on purpose!
if(x !== null & x !== undefined) {
    // Do this...
}

これは私には非常に悪い習慣のように見えますが、うまくいくようです。

私が知る限り、これらのオペレーターは 2 つの異なるタスクを実行することになっています。

var x = 3; x &= 6; // No syntax errors.

var x = 3; x &&= 6; // Syntax error.

if(x == null && x == undefined) // No syntax errors.

if(x == null & x == undefined) // No syntax errors, but wrong operator usage?

誰でもこれに光を当てることができますか?

4

3 に答える 3

8

&そのように使用すると、演算子と演算子の両方が&&論理演算子として機能します (&演算子が実際には論理演算子でなくても)。実際の違いは、短絡評価&&を使用する場合と使用しない場合です。&

&第 1 オペランドが false と評価された場合でも、第 2 オペランドを評価できる限り、演算子を使用しても問題はありません。

この&&演算子は、2 番目のオペランドが評価可能かどうかを最初のオペランドが判断するときに、2 番目のオペランドが評価されないようにするために使用できます。例えば:

if (x != null && x.prop == 42) { ... }

これは、一方をチェックしてからもう一方をチェックするよりも短くなります。

if (x != null) {
  if (x.prop == 42) { ... }
}

&&=その場合に短絡評価を使用しても意味がないため、演算子はありません。

于 2012-11-19T09:29:00.020 に答える
1

expr1 & expr2両方の引数を整数にキャストしてから、ビットごとの AND を計算します。ブール値の場合、結果は0または1(NOTfalseまたはtrue) になります。ゼロは偽であり、1 は真ですが、両方の引数が常に評価されるという違いがあります。

expr1 && expr2偽の場合は を返しexpr1、そうでない場合は評価して を返しますexpr2Expr2が偽の場合は評価されませんexpr1

于 2012-11-19T09:33:46.667 に答える
0

条件で二項演算を使用すると、有益な場合があります。

たとえば、論理的な 'XOR' 演算子はありませんが、2 進数の演算子は次のようになります。

if (cond1 ^ cond2) { // 条件の 1 つだけが true の場合に何かを行う }

ブール値に適用される二項演算子は、式を (0 または 1 までの) 整数として評価します。ここで、二項演算は有効で、明確に定義されています。

また、2 項演算はすべてのサブ式が評価されることを保証し&&ます。式が false の場合、ショートサーキット aka は評価を停止します。違いを知ることで、問題に対するベスト プラクティスを選択できます。

同様に、なぜ JavaScript が文字列やオブジェクトを比較して許可するのか、疑問を呈することもできます:

if ("foo") { // is true }
if ("false") { // is also true }
if (null) { // is false }
于 2012-11-19T09:33:24.320 に答える