• ベストアンサー

ショートカット演算(短絡演算)について

ショートカット演算(短絡演算) 以下の❶❷は意味的に等価です。 ◉リスト2-31 logical2.js if (x === 1) { console.log('こんにちは'); } ← ❶ x ===1 && console.log('こんにちは'); ← ❷ 上記は おそらく左がx=1ではないという仮定なので、左側がfalseになりこの時点で右側は実行されないので下記の二つは同じということだと思いますか?

noname#226032
noname#226032

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

>その自動的とはショートカットの事かもしれませんが、前述したとおり論理式と条件によって「ショートカットする場合、ショートカットしない場合」が有ります。 下記を実行してみれば、「&&」と「||」の挙動の違いが分かりますよ。 <html> <head> <meta http-equiv="Content-Type" content="Text/HTML; charset=Shift_JIS"> </head> <script type="text/javascript"><!-- p = prompt("数字を入力して下さい。", ""); x = parseInt(p, 10); x ===1 && console.log('「x ===1 && console.log(~)」が実行されました。'); x ===1 || console.log('「x ===1 || console.log(~)」が実行されました。'); // --></script> </html>

noname#226032
質問者

お礼

if (x === 1) { console.log('こんにちは'); } ← ❶ もしxが数値の1だったらこんにちはと出す。 x ===1 && console.log('こんにちは'); ← ❷ xが数値の1かつ、こんにちだったら?? &&はかつ、andの意味と聞いていますが、この場合もこの意味でしょうか?

その他の回答 (5)

回答No.6

>下記を実行してみれば、「&&」と「||」の挙動の違いが分かりますよ。 下記はループさせてますので、より分かりやすいと思います。 <html> <head> <meta http-equiv="Content-Type" content="Text/HTML; charset=Shift_JIS"> </head> <script type="text/javascript"><!-- while(true){ p = prompt("数字を入力して下さい。", ""); if(p==null){ break; } // 「prompt」がキャンセルされた時の処理。 x = parseInt(p, 10); x ===1 && console.log('「x ===1 && console.log(~)」が実行されました。'); x ===1 || console.log('「x ===1 || console.log(~)」が実行されました。'); } // --></script> </html>

  • notnot
  • ベストアンサー率47% (4843/10252)
回答No.5

> 確かに右側は関係ありませんでした。下記のように訂正します。 > > X==側がtrueであれば、右側の影響は請けず条件式全体が、自動的にtrueになる。 > X==側がfalseであれば、右側の影響は請けず条件式全体が、自動的にfalseになる。 > 必ず左と条件式全体が、同じになるということ。 全くの間違いです。 左辺 && 右辺 ・・・・・・・ 左辺が真なら全体は右辺と同じ、左辺が偽なら右辺を評価せず全体も偽 左辺 || 右辺 ・・・・・・・ 左辺が真なら右辺を評価せず全体が真で、左辺が偽なら全体が右辺と同じ です。 このレベルのことは入門書にきちんと書いてあるはずなのですが。

回答No.3

>X==側がtrueであれば、右側は自動的にtrueになる。 >X==側がfalseであれば、右側は自動的にfalse になる。 >必ず左右が同じになるということ。 >「||」演算子でも同様です。 > >というのが間違えなのですか? >教科書にあるんですが? 間違えです、実際にプログラムを作ってみては? その説明は変です、その自動的とはショートカットの事かもしれませんが、前述したとおり論理式と条件によって「ショートカットする場合、ショートカットしない場合」が有ります。

noname#226032
質問者

お礼

確かに右側は関係ありませんでした。下記のように訂正します。 X==側がtrueであれば、右側の影響は請けず条件式全体が、自動的にtrueになる。 X==側がfalseであれば、右側の影響は請けず条件式全体が、自動的にfalseになる。 必ず左と条件式全体が、同じになるということ。 「||」演算子でも同様です。

回答No.2

下記の認識は間違っています。 >X==側がtrueであれば、右側は自動的にtrueになる。 ↑この場合、右側は自動的にtrueになりません。 >X==側がfalseであれば、右側は自動的にfalse になる。 ↑この場合、右側は自動的にfalseになりません。 >「||」演算子でも同様です。 よって このショートカットの場合、「||」演算子と「&&」演算子では当然 挙動が違います。 ざっくりと説明すると。 >x ===1 && console.log('こんにちは'); ↑この場合、「x ===1」の式がfalseなら、(「console.log('こんにちは')」の式の帰り値が「true、false」に関係なく、この論理演算式「x ===1 && console.log('こんにちは')」はfalseに確定しショートカットするので)「console.log('こんにちは')」の式は「評価されない(つまり実行されない)」。 「x ===1」の式がtrueなら、(この論理演算式「x ===1 && console.log('こんにちは')」は「console.log('こんにちは')」の式の帰り値に依存するので、ショートカットせずに)「console.log('こんにちは')」の式も「評価される(つまり実行される)」。 >x ===1 || console.log('こんにちは'); ↑この場合、「x ===1」の式がtrueなら、(「console.log('こんにちは')」の式の帰り値が「true、false」に関係なく、この論理演算式「x ===1 || console.log('こんにちは')」はtrueに確定しショートカットするので)「console.log('こんにちは')」の式は「評価されない(つまり実行されない)」。 「x ===1」の式がfalseなら、(この論理演算式「x ===1 || console.log('こんにちは')」は「console.log('こんにちは')」の式の帰り値に依存するので、ショートカットせずに)「console.log('こんにちは')」の式も「評価される(つまり実行される)」。

noname#226032
質問者

お礼

X==側がtrueであれば、右側は自動的にtrueになる。 X==側がfalseであれば、右側は自動的にfalse になる。 必ず左右が同じになるということ。 「||」演算子でも同様です。 というのが間違えなのですか? 教科書にあるんですが?

  • notnot
  • ベストアンサー率47% (4843/10252)
回答No.1

仮定は特になくて、xが1の時とそうでないときにそれぞれlogが実行されたりしなかったりする点が同じだと言うことです。

noname#226032
質問者

お礼

X==側がtrueであれば、右側は自動的にtrueになる。 X==側がfalseであれば、右側は自動的にfalse になる。 必ず左右が同じになるということ。 「||」演算子でも同様です。

関連するQ&A

  • perlの論理演算子の「and」と「&&」の違い

    perlの論理演算子の「and」と「&&」の違いは、 「弱い結合」と「強い結合」とかで説明されている のを見かけますが、これは、 「短絡評価」(左側が偽だと右側が実行されない)と 「短絡評価でない」(左側の真偽に関係なく右側が実行される) のと同じ意味になるのでしょうか。 例えば、 sub x {  print "sub x\n";  return 0; } sub y {  print "sub y\n";  return 1; } の2つのサブルーチンがある場合に、 (1) if(&x==1 and &y==1){    print '真',"\n";   } else {    print '偽',"\n";   } (2) if(&x==1 && &y==1){    print '真',"\n";   } else {    print '偽',"\n";   } を、実行した場合、サブルーチンyは、 (1)では実行されず、(2)では実行される という理解で正しいでしょうか。 (実際にはどちらも実行されていないようなのですが)

    • ベストアンサー
    • Perl
  • perl 条件演算子 範囲演算子についてです

    演算子 条件演算子 条件演算子 ?: は条件式の値により、2者のうちのどちらかを選択します。 $a=($x<10)?10:20; 変数$aの値が$x<10という条件において、真であれば:左側の10を選び、偽であれば:右側の20を選ぶ。 $a=10; 変数$aに10を代入する。 $a==5?print "5です。\n":print "5ではありません。\n"; 条件式でaが5であれば:左側の print "5です。\n"を表示します。 条件式でaが5でなければ:右側の print "5ではありません。\n"を表示します。 $a==10?print "10です。\n":print "10ではありません。\n"; 条件式でaが10であれば:左側の "10です。\n" を表示します。 条件式でaが10でなければ:右側の "10ではありません。\n" を表示します。 範囲演算子 範囲演算子 .. は、左側の値から右側の値まで、1つずつ増やした値の集まりです。 値には、半角英数字の数値または文字列が指定できる。 print 3..5; 3 4 5 と表示する。 一応、訳を下に書いたのですが合っていますでしょうか。

  • javascriptのObject()コンストラクタについて質問です。

    javascriptのObject()コンストラクタについて質問です。 var obj = new Object(); var obj2 = Object(); console.log(obj === obj2)//false いつも質問ばかり恐縮です。。。 どこかのサイトでこの2つは等価みたいな記事を読んだような気がするのですが、 ということはObjectコンストラクタでオブジェクトを作る際はnew演算子は要らない?? のでしょうか?? またobjとobj2の2つの違いを色々試したのですが違いがわかりません。new演算子を 付けたインスタンスと付けないインスタンス??の違いをどなたか ご教授いただけると助かります。

  • JSについて教えてください。

    // FizzBuzz let i = 0; while(i < 100) { i++; if(i % 3 === 0){ console.log('Fizz'); continue; } if(i % 5 === 0){ console.log('Buzz'); continue; } if(i % 5 === 0 && i % 3 === 0){ console.log('FizzBuzz'); continue; } console.log(i); document.getElementsByClassName('js-test210')[0].innerHTML = i; } ・ 上記のように作成したのですが、 if(i % 5 === 0 && i % 3 === 0){ console.log('FizzBuzz'); continue; } の部分を一番上にもっていかないとこちらがうまくいかない理由がわかりますか? ・ continue; はこれ以下の処理は実行しないようにするという意味のようですが、 if内の記載以下の処理を実行しないようにするということなのでしょうか? ただそれだともともとそれ以下に何もないですよね???

  • OPアンプの等価回路

    画像の左側のサレンキー型ローパスフィルタの入力/出力電圧特性を解析しようとしているのですが、どうも計算がうまくいきません。 おそらく等価回路化がまちがっていると思うので、どこが間違っているかわかる方は教えていただけないでしょうか… 左側が原回路、右側が私の考えた等価回路です。 OPアンプの特性は理想的で、仮想短絡が使用でき、増幅率は∞であるとして良いです。

  • &&はかつ、andのことですよね。

    http://okwave.jp/qa/q9284426.html の続き 下記の疑問が残っているので再質問しました。1はおそらく問題ないと思いますが、2がよくわかりません? &&はかつ、andのことですよね。 if (x === 1) { console.log('こんにちは'); } ← ❶ もしxが数値の1だったらこんにちはと出す。 x ===1 && console.log('こんにちは'); ← ❷ xが数値の1かつ、こんにちだったら?? &&はかつ、andの意味と聞いていますが、この場合もこの意味でしょうか?

  • Ajaxがおかしいんです

    Javascript初級者です。 Ajaxを使ってデータの重複チェックを行おうとしました。 ところがAjaxがヘンな動きをするんです。 以下のコードなんですが、上の登録処理の中で、function doubleCheck を呼んで います。 問題は2つあって、ひとつは実際に重複していてもしていなくても「true」を 返してくることです。 console.log("res=========" + res) には「yes」とか「no」とか重複有り無しで 異なりますが、ちゃんとそれぞれセットするにも関わらず、 if(!doubleCheck() では必ず「false」が戻ってきてしまいます。 もう一つおかしい点は、重複検索(これはPHPでやってます)の最中にもかかわらず、 「true」が返ってきて "重複があったので登録できません。" お、出てしまうことです。 それで調査するために console.logその2を入れてみました(※※※のところ)。 ところがこの console 何も吐き出しません。 ということは doubleCheck() の最後の if文にたどり着いていない、または 途中でエラーになっているのかもしれません。 私の書いた Ajax のコードがおかしいんでしょうか。 どなたか御指導下さい。 よろしくお願いします。 // 追加登録処理 function doActionAdd(){ if(dataCheck()){ // customerId が 空白か否かのチェック if($('#customerId').val() == ""){ if(window.confirm("追加登録していいですか?")){ if(!doubleCheck()){ window.alert("重複はありませんでした"); }else{ window.alert("重複があったので登録できません。"); }  (以下略) function doubleCheck(){ var yomi = $('#customerYomi').val(); var res = ''; // 重複チェック $.ajax({ type: "POST", url: "../customer/CustomerDoubleCheck.php", data: {"customerYomi":yomi}, dataType: 'text', // ajax通信が成功したときの処理 success: function(request){ console.log("request=========" + request); var json = JSON.parse(request); console.log(json[0].result ); res = json[0].result; console.log("res=========" + res); }, error: function(XMLHttpRequest, textStatus, errorThrown){ $('div#jobStatus').text("重複チェック検索ができませんでした。"); return false; } }); console.log("resその2=========" + res); //※※※ if(res == "yes"){ // 重複していたので「false」を返す。 return false; }else{ // 重複していなかったので「true」を返す。 return true; } }

  • Javascript について質問です

    var tired=true; var bored=false; var nap = function() { if(tired || bored){ console.log("OK"); } else{ console.log("else"); } }; 上記のコードを書いた際、下記の実行結果となり、OKが表示されません。 どなたか原因が分かる方がおりましたら、教えてください。 else

  • 仮想基底クラスをもつクラスの代入演算2

    <仮想基底クラスをもつクラスの代入演算>の続きですが、結局、assign のようなものを作って、以下のように書くのが一番いいのでしょうか。。。 ====(一応、自己代入も考慮して書くと^^) #include <algorithm> struct X { int x; X &assign(const X &z, bool top) { if (this != &z) x = z.x; return *this; } X &operator=(const X &z) { return assign(z, true); } }; struct A : virtual X { int a; A &assign(const A &z, bool top) { if (this != &z) { if (top) X::assign(z, false); a = z.a; } return *this; } A &operator=(const A &z) { return assign(z, true); } }; struct B : virtual X { int b; B &assign(const B &z, bool top) { if (this != &z) { if (top) X::assign(z, false); b = z.b; } return *this; } B &operator=(const B &z) { return assign(z, true); } }; struct C : A, B { int c; C &assign(const C &z, bool top) { if (this != &z) { if (top) X::assign(z, false); A::assign(z, false); B::assign(z, false); c = z.c; } return *this; } C &operator=(const C &z) { return assign(z, true); } }; ==== ただ、<仮想基底クラスをもつクラスの代入演算>で、jacta さんが提示してくださった方法も、処理量は増えますが、アロケートする必要があるポインタなどのデータメンバのアロケートやデリートする処理コードをコンストラクタに集中できるので、「コーディング量の減少・改変の際の修正し忘れの可能性を低くできる」というメリットがあると思います。ハンドルクラスやコンテナクラスを実装する際は、swap() 機能が必要となると考えられるので、jacta さんのコピーコンストラクタでコピー代入を実装する方法の方がいいのかとも思います。 みなさん、どう思われますか? また、そのほかに、効果的なテクニックがあれば、ぜひ、ご教示ください。

  • node.jsのシェル上で

    コンソール上でnodejsを起動してシェルとしてつかった場合 var x="グローバル変数"; console.log(x); //とするとグローバル変数と出力されます。 さらに console.log(this.x); //とするとグローバル変数と出力されます。 そもそもグローバル変数とはトップレベルコードにおけるオブジェクトのプロパティとあります。 ブラウザだと、トップレベルのスコープで定義した変数は alert(window . variable); でアクセスできます。 ですから、nodeコンソール上で xとっ宣言した変数がthis.xとトップオブジェクトとしてアクセスできることはわかったのですが これをコンソールではなく、jsファイルに描いてそれをnodeコマンドで実行した場合 ~$ node test.js といった具合に実行させた場合 どうも、undefindeと表示されてしまうのです。 これは何が原因でundefinedと出力されてしまうのでしょうか?