一、まず ||(論理 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