javascriptに限ったはなしではないのですが、以下の結果が理解することができません。
var b1, b2;
b1 = 0 && 10;
b2 = 7 && 10;
b1は0
これは右辺を評価してはfalseで0らしいのですが、なぜfalseで、なぜfalseではなく0を返すのですか?
b2は10
これは右辺がtrueでら10らしいのですが、なぜtrueでtrueではなく10(どこからきた。。?)を返すのでしょうか?
どなたかご教示を願えますでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
&&
は、多くの言語に於いては、「左項を評価して偽ならその値を、真なら右項を評価して返す」という演算子です。何故と言われても、そういう演算子だからです。何故そういう機能になっているかというと、その方が便利だからです。
なので、0
を偽とする言語に於いては、0 && 10
は0
だし、Rubyのように0
が真の言語では10
です。
7 && 10
は左項が真なので、右項の10
が値となります。
CやPHPでは、左項そのもの、右項そのものじゃなくて0
または1
を返しますが、不便に感じる時があります。
便利な例をすぐに思い出せませんが、類似の||
・・・「左項を評価して真ならその値を、偽なら右項を評価して返す」であれば、
Ruby
1if not a 2 a = "foo" 3end 4 ↓ 5a = a || "foo" 6 ↓ 7a ||= "foo"
というのは、よく使います。
補足:Rubyを例に挙げたのは、Rubyはnilとfalse以外は真なので、こういう演算子と相性が良いから。
投稿2016/11/30 00:09
編集2016/11/30 01:18総合スコア84505
0
言語によっては、論理演算子&&
、||
(およびand
、or
) が「短絡的」な動作をします。C/C++、Perl、Java、javaScript、Python、Rubyなどの論理演算子は短絡的です。
つまり、
A && B
では、A
が偽ならB
を評価しないで偽を返す。A || B
では、A
が真ならB
を評価しないで真を返す。
さらに、短絡的な論理演算子はしばしば次のように実装されます。
B
を評価しないケースでは、A
の値をそのまま返す。- それ以外では、
B
の値をそのまま返す。
したがって、ご質問の例は次のように解釈できます。
b1 = 0 && 10;
の結果は、左項の0
となります。右項の10は評価されません(※)。
投稿2016/11/30 02:35
編集2016/11/30 03:03総合スコア4317
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
ちょっと古いですが仕様の邦訳で他にまともなものが無いので…。できれば最新のものも一度目を通してみてください。
11 式 (Expressions)
http://www2u.biglobe.ne.jp/~oz-07ams/2002/ecma262r3/11_Expressions.html生成規則 LogicalANDExpression : LogicalANDExpression && BitwiseORExpression は、次のように評価される:
- LogicalANDExpression を評価。
- GetValue(Result(1)) を呼出す。
- ToBoolean(Result(2)) を呼出す。
- Result(3) が false ならば、 Result(2) を返す。
- BitwiseORExpression を評価。
- GetValue(Result(5)) を呼出す。
- Result(6) を返す。
↓
9 型変換 (Type Conversion)
http://www2u.biglobe.ne.jp/~oz-07ams/2002/ecma262r3/9_Type_Conversion.html9.2 ToBoolean
ToBoolean 演算子は、次の表にしたがって引数を Boolean 型の値に変換する。
...
Number 引数が +0, -0, NaN ならば結果は false; そうでなければ true
...
JavaScript
1b1 = 0 && 10; 2//1. &&の左辺を読み取る 3//2. GetValue → 0 4//3. ToBoolean → false(0だから) 5//4. 3.の結果はfalseなので2.の結果である0を返す
JavaScript
1b2 = 7 && 10; 2//1. &&の左辺を読み取る 3//2. GetValue → 7 4//3. ToBoolean → true(0でもNaNでもないから) 5//4. 3.の結果はtrueなので該当しない 6//5. &&の右辺を読み取る 7//6. GetValue → 10 8//7. 6.の結果は10なので10を返す
投稿2016/11/30 00:16
編集2016/11/30 00:20総合スコア849
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/11/30 03:15