一、まず ||(論理 OR)について説明します。字義どおりに言えば、前後が両方とも false の場合にのみ false を返し、それ以外は true を返します。

alert(true||false);       // true
alert(false||true);       // true
alert(true||true);        // true
alert(false||false);      // false

しかし、深い意味で言うと、また別の世界が広がっています。次のコードを試してみてください。

alert(0||1);

明らかに、前の 0 は false を意味し、後の 1 は true を意味することがわかります。前述の結果は true になるはずですが、実際に返される結果は 1 です。さらに次のコードを見てみましょう:

alert(2||1);

前の 2 は true、後の 1 も true であることはわかっています。では、返される結果は何でしょうか?テスト結果は 2 です。続けて見てみましょう:

alert('a'||1);

同様に、前の 'a' は true、後の 1 も true です。テスト結果は 'a' です。次に、

alert(''||1);

上記により、前の '' は false、後の 1 は true で、返される結果は 1 であることがわかります。さらに次のものを見てみましょう。

alert('a'||0);

前の 'a' は true、後の 0 は false で、返される結果は 'a' です。続けて次のものを見てみましょう。

alert('a'||'b');

前の 'a' は true、後の 'b' は false で、返される結果は 'a' です。さらに続けて次のものを見てみましょう。

alert(''||0);

前の '' は false、後の 0 も同様に false で、返される結果は 0 です。

alert(0||'');

前の 0 は false、後の '' は false で、返される結果は '' です。

これはつまり:

  • 1、|| の前が false であれば、|| の後ろが true であろうと false であろうと、|| の後ろの値を返します。
  • 2、|| の前が true であれば、|| の後ろが true であろうと false であろうと、|| の前の値を返します。

二、次に &&(論理 AND)について説明します。字義どおりに言えば、前後が両方とも true の場合にのみ true を返し、それ以外は false を返します。

alert(true&&false);      // false
alert(true&&true);       // true
alert(false&&false);     // false
alert(false&&true);      // false

そして、上記の経験に基づいて、&& の前後が単なるブール型ではない場合を見てみましょう。

alert(''&&1);

結果は '' を返します。&& の前の '' は false で、後ろの 1 は true です。

alert(''&&0);

結果は '' を返します。&& の前の '' は false で、後ろの 0 も false です。

alert('a'&&1);

結果は 1 を返します。&& の前の 'a' は true で、後ろの 1 も true です。

alert('a'&&0);

結果は 0 を返します。&& の前の 'a' は true で、後ろの 0 は false です。

alert('a'&&'');

結果は '' を返します。&& の前の 'a' は true で、後ろの '' は false です。

alert(0&&'a');

結果は 0 を返します。&& の前の 0 は false で、後ろの 'a' は true です。

alert(0&&'');

結果は 0 を返します。&& の前の 0 は false で、後ろの '' も false です。

これはつまり、

  • 1、&& の前が false であれば、&& の後ろが true であろうと false であろうと、結果は && の前の値を返します。
  • 2、&& の前が true であれば、&& の後ろが true であろうと false であろうと、結果は && の後ろの値を返します。

まとめましょう:

  • 1、|| の前が false であれば、|| の後ろが true であろうと false であろうと、結果は || の後ろの値を返します。
  • 2、|| の前が true であれば、|| の後ろが true であろうと false であろうと、結果は || の前の値を返します。
  • 3、&& の前が false であれば、&& の後ろが true であろうと false であろうと、結果は && の前の値を返します。
  • 4、&& の前が true であれば、&& の後ろが true であろうと false であろうと、結果は && の後ろの値を返します。

上記の2つのテストからわかるように、論理演算子 || と && はどちらも短絡評価の原則に従い、記号の前の真偽が確定すれば、戻り値を確定できます。

説明しておくと、&& の優先順位は || よりも高いです。次のテストを見てください:

alert(1||'a'&&2);

返される結果は 1 です。

背理法に基づき、|| の優先順位が && 以上であると仮定します(ここで「以上」という表現を使うのは、同じ優先順位の場合も同時に証明するためです)。

上記で導き出した結論(1)により、(1||'a')は前の値 1 を返します。(1&&2) は結論(4)に従い後ろの値 2 を返すはずです。これは明らかに正しくないため、&& の優先順位が || よりも高いことがわかります。

ソースアドレス:http://www.cnblogs.com/pigtail/archive/2012/03/09/2387486.html