質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

4回答

1144閲覧

論理演算子について

SugiuraY

総合スコア317

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2016/11/29 23:48

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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

&&は、多くの言語に於いては、「左項を評価して偽ならその値を、真なら右項を評価して返す」という演算子です。何故と言われても、そういう演算子だからです。何故そういう機能になっているかというと、その方が便利だからです。

なので、0を偽とする言語に於いては、0 && 100だし、Rubyのように0が真の言語では10です。
7 && 10は左項が真なので、右項の10が値となります。

CやPHPでは、左項そのもの、右項そのものじゃなくて0または1を返しますが、不便に感じる時があります。

便利な例をすぐに思い出せませんが、類似の||・・・「左項を評価して真ならその値を、偽なら右項を評価して返す」であれば、

Ruby

1if not a 2 a = "foo" 3end 45a = a || "foo" 67a ||= "foo"

というのは、よく使います。

補足:Rubyを例に挙げたのは、Rubyはnilとfalse以外は真なので、こういう演算子と相性が良いから。

投稿2016/11/30 00:09

編集2016/11/30 01:18
otn

総合スコア84505

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SugiuraY

2016/11/30 03:15

ご回答ありがとうございます。orの例まで大変ありがたいです。メモさせていただきます!
guest

0

言語によっては、論理演算子&&|| (およびandor) が「短絡的」な動作をします。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
ikedas

総合スコア4317

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SugiuraY

2016/11/30 03:20

短絡的という表現をはじめて知りました。ちょっと調べてみます。 ご回答頂き、有難うございました。
guest

0

リファレンスによればexpr1 && expr2というのは、

expr1 を false と見ることができる場合は、expr1 を返します。そうでない場合は、expr2 を返します。

false と見ることができる式の例は、null、0、空文字列 ("")、あるいは、undefined と評価されるものです。

だそうです。

投稿2016/11/30 00:09

ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SugiuraY

2016/11/30 03:16

null、0、空文字列 ("")、undefinedはfalse判定ですね! ご回答有難うございます。
guest

0

ベストアンサー

ちょっと古いですが仕様の邦訳で他にまともなものが無いので…。できれば最新のものも一度目を通してみてください。

11 式 (Expressions)
http://www2u.biglobe.ne.jp/~oz-07ams/2002/ecma262r3/11_Expressions.html

生成規則 LogicalANDExpression : LogicalANDExpression && BitwiseORExpression は、次のように評価される:

  1. LogicalANDExpression を評価。
  2. GetValue(Result(1)) を呼出す。
  3. ToBoolean(Result(2)) を呼出す。
  4. Result(3) が false ならば、 Result(2) を返す。
  5. BitwiseORExpression を評価。
  6. GetValue(Result(5)) を呼出す。
  7. Result(6) を返す。

9 型変換 (Type Conversion)
http://www2u.biglobe.ne.jp/~oz-07ams/2002/ecma262r3/9_Type_Conversion.html

9.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
sii_side

総合スコア849

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SugiuraY

2016/11/30 03:19

ご回答ありがございます。 非常に分かりやすかったです、0→false→左項を返す、7→true→右項を返すですね。 非常にすっきりしました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問