• ベストアンサー

jsで、比較演算子が使用可なのはif文だけ?

javascriptで、比較演算子が使用可なのはif文だけ? だとするとifには致命的な欠点があり、 結果(返り値)のパターンが真偽のどちらかになります。 switch文などのように、2つ以上のパターンに分けることはできません。 どれも一長一短で使い物にならないですネ。ヽ(`Д´)ノプンプン

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

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

おまけ、AとBが、確実にbooleanである保証があるなら、 <script> let a=5; let b=5; let c=(a==b)*100; console.log(c); </script> ちょっと気持ち悪いコードだが、 本来 a==bはbooleanだが、JavaScriptは、それに対して演算するとintになるので、 ↑の例は、c=a==b?100:0;と等価になる。。 ならば、さっきのサンプルは、 switch(a+b*2) ~ でも行けるかもね。 ローカルデバッガーで試したら、 let ans=true+true;の答えは「2」になってるので、 こんだけでも、行けるのは、確認した。 (パニックになるのでこのやり方はお勧めできないが) 一応、時にbooleanはただの数字でもあるってのを 覚えておくといつか役に立つかもね! (他の言語には「型」があるのでエラーだろうが、  これができるのはJavaScript位の物だろうな~) では~がんばって!

sembokulove
質問者

補足

難しくなるので、やめときます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (6)

回答No.6

#5さんまいど! -- f( A && B ) { 結果A1 結果A2 結果A3 }else if(A){ 結果B1 結果B2 結果B3 }else if(B) { Bだけが真の場合 結果C1 結果C2 結果C3 どちらも偽の場合 結果D1 結果D2 結果D3 } -- ならば、それを数字に置き換えればいい function test(A,B) { switch(A?1:0 | B? 2:0) { case 0: /* どちらも偽の場合 */ return ["結果D1","結果D2","結果D3"]; case 1: /* Aだけが真の場合 */ return ["結果B1","結果B2","結果B3"]; case 2: /* Bだけが真の場合 */ return ["結果C1","結果C2","結果C3"]; case 3: /* AもBも真の場合 */ return ["結果A1","結果A2","結果A3"]; } /* 2ビットは0~3までしかないので、defaultは不要 */ } let ans=test(false,false); ←ここを好きに書き換えて、テスト console.log(ans); まず、return は複数の値は返せます。 また、switchで一度に複数の条件を設定することも可能です。 これは、他の言語でも使えます。論理演算子と三項演算子を 使用した例になります。 B? 2:0 これは、 if (B==true) return 2; else return 0; を数字にしたものです。0か2しか返さないので、 これは「ビット1」と扱い、それを論理演算させたものを switchにセレクター値として渡すことで、 4種の判定を一度のswitchでifなしで行っています。 また、返り値が「3個ある」との事なので、 一度のreturn で「3個の返り値」を同時に返しています。 try it.

全文を見る
すると、全ての回答が全文表示されます。
  • t_ohta
  • ベストアンサー率38% (5088/13306)
回答No.5

return で値を複数返したいなら配列で返せばいいんじゃなですか。 JavaScript以外の言語でも出来る事は同じだと思います。

全文を見る
すると、全ての回答が全文表示されます。
  • notnot
  • ベストアンサー率47% (4852/10266)
回答No.4

> 申し訳ございませんが違います。 何がどう違うのでしょうか?

sembokulove
質問者

補足

僕のイメージだと、 A01とB01が合致する条件の場合に、180、1600 A01とB02が合致する条件の場合に、200、1800 A02とB01が合致する条件の場合に、220、2000 A02とB02が合致する条件の場合に、240、2200という風にしたいのですが、これは、どの関数を使ってもダメ、 if文だと、まず、180と1600が返り値として出てくることはできないし、 switch文だと、A01だったら、A01しか条件式を作れず、A01とB01が合致したらといった具合のパターンは作れず、セレクトボックス1個の時の選択状態しかできません。ヽ(`Д´)ノプンプン

全文を見る
すると、全ての回答が全文表示されます。
  • notnot
  • ベストアンサー率47% (4852/10266)
回答No.3

あと、値が真偽値と確定していてtrueとfalse以外あり得なくて、その組み合わせで4分岐したいなら、 switch( A+"-"+ B){ case "true-true": ~~; break; case "true-false": ~~; break; case "false-true": ~~; break; case "false-false": ~~; break; default: 何らかのバグがで真偽値以外が入っていた; } みたいな書き方もします。

sembokulove
質問者

補足

個人的には switch文でも構いませんが、 switch文って確か、 条件式を2つつけることは不可能でしたよね。 あなたが挙げられた例だと、 A01とB01が合致する条件の場合に、180、1600 A01とB02が合致する条件の場合に、200、1800 A02とB01が合致する条件の場合に、220、2000 A02とB02が合致する条件の場合に、240、2200といった具合にはできないです。 if文だと、まず、180と1600が返り値として出てくることはできないし、 switch文だと、A01だったら、A01しか条件式を作れず、A01とB01が合致したらといった具合のパターンは作れず、セレクトボックス1個の時の選択状態しかできません。ヽ(`Д´)ノプンプン

全文を見る
すると、全ての回答が全文表示されます。
  • notnot
  • ベストアンサー率47% (4852/10266)
回答No.2

もしかして、 If( A && B ) { 両方が真の場合 }else if(A){ Aだけが真の場合 }else if(B) { Bだけが真の場合 }else{ どちらも偽の場合 } のような多重分岐を見たことが無いと言うことでしょうか? 普通に何処でも使われているので、珍しい物では無いですが。

sembokulove
質問者

補足

申し訳ございませんが違います。 If( A && B ) { 結果A1 結果A2 結果A3 }else if(A){ 結果B1 結果B2 結果B3 }else if(B) { Bだけが真の場合 結果C1 結果C2 結果C3 どちらも偽の場合 結果D1 結果D2 結果D3 } という漢字です。

全文を見る
すると、全ての回答が全文表示されます。
  • notnot
  • ベストアンサー率47% (4852/10266)
回答No.1

> javascriptで、比較演算子が使用可なのはif文だけ? いいえ。 式が書けるところならば何処にでも書けます。

sembokulove
質問者

補足

ようするに異なる2つのセレクトボックスで、value値がa01のものと、b01のものと値を2つ選びます。 そうすると、仮に if文であれば、(a01&&b01)という、複数条件ができるのはifだけとなります。 これは、ifだけの特徴であり、 他のswitch文などではできません。 しかし、そのif文の欠点は結果(返り値)が2つしか取れません。 ifの特徴もswitchの特徴も兼ね備えたものはjavascriptにはなく、javaとか何かほかのプログラムの出番になるでしょうか。ヽ(`Д´)ノプンプン。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 比較演算子について

    javascript超初心者です 質問1 型も比較する比較演算子の===は基本的にユーザーからの入力からの値を受け取るときにつかうのでしょうか? 例えばサイト管理者側で設定した変数を使う場合などは==だけでいいでしょうか? var time = 60; if( time === 0 ) { alert('0です') } 質問2 ==より===のほうが処理スピードは遅いですか? よろしくお願いします

  • phpのswitch文について switchはif

    phpのswitch文について switchはifと違って、条件式の中がブール型の論理演算とかではないんですか? 完全に1つの値とかなんですかね? $num1>5とかそういうのは入らないんですか?

    • ベストアンサー
    • PHP
  • switch文をif文に変換

    以下のプログラムをif文に書き換えるとどうなるでしょうか? if文と論理演算子を使って短く書きかえられるらしいのですが。 #include <stdio.h> main() { int no; scanf("%d",&no); switch (no){ case 1: puts("1番です。\n"); break; case 2: puts("2番です。\n"); break; case 3: puts("3番です。\n"); break; case 4: puts("4番です。\n"); break; case 5: puts("5番です。\n"); break; case 6: puts("6番です。\n"); break; default: puts("そんな学年はありません。"); break; } }

  • switch()文で値の大小比較

    例えば$numという変数の値が50以下の場合、 51以上80以下の場合、81以上の場合の処理と分けたい場合、 switch()文でif()のように値の大小比較をする事は出来ないのでしょうか? 以下のような比較を行いたいです。 (以下は例なので、if()で良いだろうという突っ込みは要りません) switch ($num) { case <= 50: 処理1 case <= 80: 処理2 default: 処理3 }

    • ベストアンサー
    • PHP
  • Python in演算子について

    Pythonにin演算子があります。 これは、真偽値をとるため、if文等でつかわれています。 しかし、for文のin for i in a: aはオブジェクトでiはその要素ですが、この場合は真偽値をとりません。 この場合はin演算子としてのinとは考えないのが普通のような気がするのですが? 宜しくねがいます。

  • C言語のswitch case文で、scanfでキーボードから読み込ん

    C言語のswitch case文で、scanfでキーボードから読み込んだ1~12の値によって画面に季節を、3~5は"春"、6~8は"夏"・・・というふうに表示させるプログラムなのですが、if文を使わずにswitch caseで作るには case 3: case 4: case 5:puts("春"); break; ・ ・ ・ と1個1個記述するしかないのでしょうか? もし比較演算子と論理演算子を使って 3<= && <=5 こんな感じに1行にまとめることができるなら教えてください。

  • 条件分岐(IF文)の簡素化

    javascript初心者です。 下記のように7つの変数を利用した組み合わせで、表示内容を変えるjavascriptを組んでいます。 IF文で組んでみたところ、下記のように18通りのIF文になってしまいました。 このjavascriptについては、変数を変えて1ページに10ケ所に配置するため、クライアントマシンは、180通りのIF文計算をすることになるため、簡素化したいと考えています。 switch文だと条件分岐を簡素化出来そうですが、例文では、変数がひとつの場合の例しか載っておらず、複数の場合の記載例がありませんでした。 もっと効率的な方法があると思うため、IF文に限らず良い方法をご指導頂きたくお願いする次第です。 宜しくお願い致します。 var a1 var a2 var a3 var a4 var a5 var a6 var a7 if (a1=="") { document.write("1の作業"); } else if (a2<a3*50) { document.write("2の作業"); } else if ((a2<a3*50) && (a4>=1000) && (a5<=1000) && (a6>=300) && a7="") ) { document.write("2の作業"); } else if ((a2<a3*50) && (a4>=1000) && (a5<=1000) && (a6<299) && a7="") ) { document.write("3の作業"); } else if ((a2<a3*50) && (a4>=1000) && (a5>1000) && (a6>=300) && a7="") ) { document.write("4の作業"); } else if ((a2<a3*50) && (a4>=1000) && (a5>1000) && (a6<299) && a7="") ) { document.write("5の作業"); } else if ((a2<a3*50) && (a4<1000) && (a5<=1000) && (a6>=300) && a7="") ) { document.write("6の作業"); } else if ((a2<a3*50) && (a4<1000) && (a5<=1000) && (a6<299) && a7="") ) { document.write("7の作業"); } else if ((a2<a3*50) && (a4<1000) && (a5>1000) && (a6>=300) && a7="") ) { document.write("8の作業"); } else if ((a2<a3*50) && (a4<1000) && (a5>1000) && (a6<299) && a7="") ) { document.write("9の作業"); } else if ((a2<a3*50) && (a4>=1000) && (a5<=1000) && (a6>=300) && a7="1") ) { document.write("10の作業"); } else if ((a2<a3*50) && (a4>=1000) && (a5<=1000) && (a6<299) && a7="1") ) { document.write("11の作業"); } else if ((a2<a3*50) && (a4>=1000) && (a5>1000) && (a6>=300) && a7="1") ) { document.write("12の作業"); } else if ((a2<a3*50) && (a4>=1000) && (a5>1000) && (a6<299) && a7="1") ) { document.write("13の作業"); } else if ((a2<a3*50) && (a4<1000) && (a5<=1000) && (a6>=300) && a7="1") ) { document.write("14の作業"); } else if ((a2<a3*50) && (a4<1000) && (a5<=1000) && (a6<299) && a7="1") ) { document.write("15の作業"); } else if ((a2<a3*50) && (a4<1000) && (a5>1000) && (a6>=300) && a7="1") ) { document.write("16の作業"); } else if ((a2<a3*50) && (a4<1000) && (a5>1000) && (a6<299) && a7="1") ) { document.write("17の作業"); } else { document.write("18の作業"); }

  • 動画変換フリーソフト

    動画をDVDに書き込めるファイル(おもにmpg2)に変換するフリーソフトでよいものを教えてください。 いろいろ使ってみましたが、それぞれ一長一短がありまして Moo0動画変換器    長所:返還後のファイルサイズがXmediaのように大きくならないので、                    ほとんど4.7GDVDに書き込める               欠点:.時々動画の後半で「音ずれ」が起きることがある Xmediarecord      長所:音ずれは無い               欠点:変換後のファイルサイズが大きくなって4.7Gに入り切れない          AnyVideoConverteor 長所:なし              欠点:ほとんど使い物にならない。とんでもない音ずれ、画面カクカクの動きなど。 なんですが、よろしくお願いします。

  • MySQL接続後の比較演算子について

    お世話になります。 指定した文字列とデータベースにセットされている文字列を比較して、 マッチしたら該当のカラムにセットされている文字列を吐き出し、 マッチしない場合は、エラー文を走らせるプログラムを構築しております。 例えば、 【 ※スクリプト1 】 // データベースに接続する $dsn = "$dbtype:dbname=$dbname;host=$sv"; $conn = new PDO($dsn, $user, $pass); $mail = "aaa@aaa.com"; $question = "好きな国は?"; $answer = "フランス"; $sql = "SELECT id, usr_name, mail, question, answer FROM テーブル名"; $stmt = $conn->prepare($sql); $stmt->execute(); while ($row = $stmt->fetch()) { if($row['mail'] == $mail && $row['question'] == $question && $row['answer'] == $answer){ //条件が一致した場合 echo "ユーザ名:".cnv_enc($row["usr_name"], $enc_disp, $enc_db); exit(); } } $sql = "SELECT id, usr_name, mail, question, answer FROM テーブル名"; $stmt = $conn->prepare($sql); $stmt->execute(); while ($row = $stmt->fetch()) { if($row['mail'] != $mail || $row['question'] != $question || $row['answer'] != $answer){ //条件が一致しない場合 echo "該当なし"; exit(); } } と書くと、【 $mail 】、【 $question 】、【 $answer 】の文字列を変更してもしなくても 正常に結果が返りますが、 【 ※スクリプト2 】 // データベースに接続する $dsn = "$dbtype:dbname=$dbname;host=$sv"; $conn = new PDO($dsn, $user, $pass); $mail = "aaa@aaa.com"; $question = "好きな国は?"; $answer = "フランス"; $sql = "SELECT id, usr_name, mail, question, answer FROM テーブル名"; $stmt = $conn->prepare($sql); $stmt->execute(); while ($row = $stmt->fetch()) { if($row['mail'] != $mail || $row['question'] != $question || $row['answer'] != $answer){ //条件が一致しない場合 echo "該当なし"; exit(); } } と書くと、【 $mail 】、【 $question 】、【 $answer 】の文字列を変更してもしなくても 【 該当なし 】が返ってしまいます。 試しに【 ※スクリプト2 】のif文をelseで更に分岐しても結果は同じでした。 今までデータベースからデータを引っ張って来る段階で、 比較演算子は殆ど使用していなかったので、whileで表示させる際に 条件分岐や演算子の特別な制約があるのでしょうか? 色々な書き方を試してみましたが、長時間作業していると混乱してきましたので、 どうかご教示の程よろしくお願い申し上げます。 PHP 5.3.3 MySQL 5.0.95

    • ベストアンサー
    • PHP
  • if文の演算子について

    if文の演算子について int a=0,b=1,c=1,d=1; if(a==1 && b==1 && c==1 ||d==1){ Printf("yes"); }else{ Printf("no"); } if((a==1 && b==1 && c==1 )||d==1){ Printf("yes2"); }else{ Printf("no2"); } } 上記のif文で出力結果が異なります。 if((a==1 && b==1 && c==1 )||d==1)の方はa=1、b=1、c=1の時もしくはd=1の時と 理解できるのですが、 if(a==1 && b==1 && c==1 ||d==1)の方は、どういう条件の時が当てはまるのでしょうか?