• ベストアンサー

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

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

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

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

>なぜ条件式以外で使うかがよく理解できません。 実は「演算子は、式が書ける場所なら、どこで、どう使っても良い」のです。例えそれが「無意味」だとしても。 例えば、以下の例を見て下さい。 例❶ int x = 1; if (x === 1) { console.log('こんにちは'); } 次に、以下の例を見て下さい。 例❷ int x = 1; boolean b; b = x === 1; if (b) { console.log('こんにちは'); } 判定結果を、一旦、変数bに入れて、変数bの値がtrueかfalseかを、if文で判定しています。 どちらも「ifの条件式」には「trueかfalseになる式を書いている」のです。 例❷では「===演算子」を「if文の条件式以外の場所」で使っています。「変数bへの代入文の、代入する値の所」で使っています。 同様に、&&演算子も「if文の条件式以外の場所」で使って構わないのです。 例えば 例❸ int x = 1; int y = 2; boolean b; b = x === 1 && y === 2; if (b) { console.log('こんにちは'); } のように、代入文の「代入する値」の所で使っても構いません。 このように「論理演算子の&&や||は、if文の条件式以外の場所でも使用可能」なのです。 上記を踏まえて、以下の2つの例を見て下さい(計算だけして、出力も何もしない、無意味なプログラムです) 例❹ int x = 1; int y = 2; boolean b; b = x === 1 && y === 2; 例❺ int x = 1; int y = 2; int b; b = x + y; 例❹と例❺は「やってる事は違うけど、同じような構文」です。 「演算子が加算演算子か、論理積演算子か」の違いしかありません。 例❹も例❺も「変数bに代入しただけで、その後、変数bを使ってない」ので「変数bを宣言しない」「変数bに代入しない」ように書き換えできます。 例❻ int x = 1; int y = 2; x === 1 && y === 2; 例❼ int x = 1; int y = 2; x + y; ここで、例❻が「どこかで見覚えのあるプログラム」と似ていると思いませんか? 似ているのは x === 1 && y === 2; と x ===1 && console.log('こんにちは'); です。 「y === 2」の部分が「console.log('こんにちは')」に変わっただけで「やってる事は違うけど、同じような構文」になっています。 例❻も例❼も「計算だけ(式の評価)だけを行なって、評価した値を捨てている」ので、無意味なプログラムになっています(実行しても、結果を表示しない) このように「構文エラーにさえならなければ、演算子は、式が書ける場所なら、どこに、どのように使っても構わない」のです(「式が書ける場所だけ」ですので注意)

noname#226032
質問者

お礼

ショートカット演算(短絡演算) 以下の❶❷は意味的に等価です。1と2は違う式だが同じ結果になるということ。 if (x === 1) { console.log('こんにちは'); } ← ❶ else省略している。真だった時だけ{}ないを実行する。 もしxが数値の1だったらこんにちはと出す。 そうでなかった場合は何も表記されない。 偽は省略されている。 x ===1 && console.log('こんにちは'); ← ❷ 真だった時(xが数値の1だった場合)だけ&&以降を実行する。条件式ではないケースなので、両方当てはまった場合何かを実行するわけではない。 偽だった時(xが数値の1以外だった場合)は&&以降は実行されない。つまり何も表記されない。 条件式の場合はこのようになる。 xが数値の1かつ、こんにちだったら。  こんかいはそもそも条件式でないのでこのようにならない。 &&はかつ、andの意味と聞いていますが、この場合もこの意味でしょうか? ❶と❷は「意味も書き方も全然違うが、実行した結果が、偶然、同じになる」のです。 ありがとうございました。上記の認識でよいですね。

その他の回答 (14)

回答No.16

>IF(x===1 && console.log('こんにちは'); ) >だったら両方が正しかった時のみ実行するとなりますが、()に囲まれていないときは、 >左が正しかった時だけ右を実行するという形に変わると暗記するしかないのですかね。 >どう区別するのでしょうか? 「()に囲まれていないときは、左が正しかった時だけ右を実行するという形に変わる」と言う認識は間違いです。 if(x===1 && console.log('こんにちは')){console.log('こんばんは');} ↑このようなと言う条件式が有ったとして、JavaScriptでは条件式は「ショートサーキット評価」されます。 この条件式の場合、「x===1」の式がfalseなら、(「console.log('こんにちは')」の式の帰り値が「true、false」に関係なく、この論理演算式「x===1 && console.log('こんにちは')」はfalseに確定しショートカットするので)「console.log('こんにちは')」の式は「評価されない(つまり実行されない)」、この条件式はfalseになるので「console.log('こんばんは')」も実行されない。 「x===1」の式がtrueなら、(この論理演算式「x===1 && console.log('こんにちは')」は「console.log('こんにちは')」の式の帰り値に依存するので、ショートカットせずに)「console.log('こんにちは')」の式も「評価される(つまり実行される)」、「console.log('こんにちは')」の帰り値はundefinedなので、(「x===1」の式がtrueなら)この条件式「x===1 && console.log('こんにちは')」の演算結果もundefinedになるようなので「console.log('こんばんは')」は実行されない。 つまり、この論理演算式の挙動の肝は「ショートサーキット評価」だと言う事です。 くどいようですが、「ショートサーキット評価」でない場合はショートカットはしない、「ショートサーキット評価」の場合は条件によってショートカットする、と言う事です。

回答No.15

訂正(2)です。 >>>こんかいはそもそも条件式でないのでこのようにならない。 >>console.log(~)の帰り値がundefinedだったとしても条件式です。 >>つまり、もしconsole.log(~)の帰り値がundefinedだったとしたら「x ===1 && console.log('こんにちは')」は「x ===1 && undefined」と等価となります、(結果的にエラーだったとしても)これでも条件式です。 >console.log(~)の帰り値がundefinedだったとしても"論理式"です。 >つまり、もしconsole.log(~)の帰り値がundefinedだったとしたら「x ===1 && console.log('こんにちは')」は「x ===1 && undefined」と等価となります、(結果的にエラーだったとしても)これで"論理式"です。 「x===1」の「===」比較演算子です、よって「x===1」は比較演算です。 「x===1 && console.log(~)」の「&&」は論理算子です、よって「x===1 && console.log(~)」は論理演算です。 条件式に特徴的に用いられる演算子として比較演算子、論理演算子などがある、と言う事です。

noname#226032
質問者

お礼

ありがとうございます。 難しいですね。 IF()となっていなければ条件式ではないと思ったのですが、 このような形でない条件式もあるのですね。 疲れました。 ただそれ以外の結果の実行部分に関しては正しいのですよね。

noname#226032
質問者

補足

>>>こんかいはそもそも条件式でないのでこのようにならない。 console.log(~)の帰り値がundefinedだったとしても条件式です。 つまり、もしconsole.log(~)の帰り値がundefinedだったとしたら 「x ===1 && console.log('こんにちは')」は「x ===1 && undefined」と等価となります、( 結果的にエラーだったとしても)これでも条件式です。 比較演算子、論理演算子などがある場合は、IF()のようになっていなくても条件式なのですね。 ただ条件式だったとしても下記はXが1だった時のみ右側を実行する。1出なかった場合は実行しないという結論は正しいのですね。 x ===1 && console.log('こんにちは'); IF(x ===1 && console.log('こんにちは'); ) だったら両方が正しかった時のみ実行するとなりますが、()に囲まれていないときは、 左が正しかった時だけ右を実行するという形に変わると暗記するしかないのですかね。 どう区別するのでしょうか?

回答No.14

訂正です。 >>こんかいはそもそも条件式でないのでこのようにならない。 >console.log(~)の帰り値がundefinedだったとしても条件式です。 >つまり、もしconsole.log(~)の帰り値がundefinedだったとしたら「x ===1 && console.log('こんにちは')」は「x ===1 && undefined」と等価となります、(結果的にエラーだったとしても)これでも条件式です。 console.log(~)の帰り値がundefinedだったとしても"論理式"です。 つまり、もしconsole.log(~)の帰り値がundefinedだったとしたら「x ===1 && console.log('こんにちは')」は「x ===1 && undefined」と等価となります、(結果的にエラーだったとしても)これで"論理式"です。

回答No.13

>こんかいはそもそも条件式でないのでこのようにならない。 console.log(~)の帰り値がundefinedだったとしても条件式です。 つまり、もしconsole.log(~)の帰り値がundefinedだったとしたら「x ===1 && console.log('こんにちは')」は「x ===1 && undefined」と等価となります、(結果的にエラーだったとしても)これでも条件式です。 >xが数値の1かつ、こんにちだったら。  その認識は間違ってます。 xが数値の1かつ、console.log(~)だったらです。 前述したとおり、console.log(~)の帰り値はundefinedなので「xが数値の1かつ、console.log(~)だったら」は「xが数値の1かつ、undefinedだったら」となります。 >&&はかつ、andの意味と聞いていますが、この場合もこの意味でしょうか? そうです。 >❶と❷は「意味も書き方も全然違うが、実行した結果が、偶然、同じになる」のです。 偶然と言う表現はチョットちがうでしょう、実行した結果が同じようになるようにプログラマーが意図的に記述していると言う事です。 注意していただきたいのは、あくまでも「ショートサーキット評価」の場合の挙動だと言う事で、「ショートサーキット評価」でない場合には当てはまりません。

回答No.12

やっちまった。訂正 demo2 の最後のあたり。 setTimeout (demo2, 30); に。

回答No.11

肝心な事を忘れてた。 &&の右側の式の評価は何を返しても良いのです。 もともと式全体の評価なんて気にしていないのですから。 console.log(typeof console.log("")); console.log() は、 undefined を返します (true) && undefined なので、false が無駄に利用されず計算されました。

noname#226032
質問者

お礼

ショートカット演算(短絡演算) 以下の❶❷は意味的に等価です。1と2は違う式だが同じ結果になるということ。 if (x === 1) { console.log('こんにちは'); } ← ❶ else省略している。真だった時だけ{}ないを実行する。 もしxが数値の1だったらこんにちはと出す。 そうでなかった場合は何も表記されない。 偽は省略されている。 x ===1 && console.log('こんにちは'); ← ❷ 真だった時(xが数値の1だった場合)だけ&&以降を実行する。条件式ではないケースなので、両方当てはまった場合何かを実行するわけではない。 偽だった時(xが数値の1以外だった場合)は&&以降は実行されない。つまり何も表記されない。 条件式の場合はこのようになる。 xが数値の1かつ、こんにちだったら。  こんかいはそもそも条件式でないのでこのようにならない。 &&はかつ、andの意味と聞いていますが、この場合もこの意味でしょうか? ❶と❷は「意味も書き方も全然違うが、実行した結果が、偶然、同じになる」のです。 ありがとうございました。上記の認識でよいですね。

回答No.10

斜め横からちゃぶ台をひっくり返すようで申し訳ない。 これだけ説明されても私自身、教える方も学ぶ方も「なんでかなぁ~」と思ってしましました。 短く書くことが有意義なのですか?(過去の私は乱用してましたが) if 文で書けたらそれで良いのではないですか? 短く書くなら x ===1 && console.log('こんにちは'); ではなく x ==1 && console.log('こんにちは'); で、いいじゃん。 console.log の評価の結果と x が1なのかという評価の演算も余計にしているので、多分遅い(確かめていませんが) 以下で良し!! if (x==1) console.log('こんにちは'); -- "&" は、html文書の中のスクリプトにあると文法違反だし可読性にかけますよ。 -- 下に書いたプログラムの demo と demo2 は、同じ動きをします。 短く書くためだけのコードがメンテナンスしやすい(理解しやすい)とは限りません。 もっと短く書ける人もいるでしょうが、それはやっぱりお遊びであって・・・ <!DOCTYPE html> <meta charset="utf-8"> <title>説明は無理</title> <style> body {  color: white;  background: black; } p span {  position: absolute; } </style> <body> <p> <span>X</span> <script> var sx = 16, sy = 32, x = 0, y = 30, mx = 300, my = 300, g, h = document.querySelector ('span'), i = 1; function demo () {  h.style.top = y + 'px';  h.style.left = x + 'px';    x += sx * i;    if (mx < x) {   x = mx;   i = -i;   y += sy;   }  if (x < 0) {   x = 0;   i = -i;   y += sy;  }  if (y < my)   setTimeout (demo, 30); } function demo2 () {  h.style.top = y + 'px';  h.style.left = x + 'px';  (((mx < (x = x + sx * i) && (x = mx)) || (x < 0 && (x = 0, 1))) && (i = -i, y += sy) || y < my) && setTimeout (demo, 30); } demo2 (); // demo(); </script>

noname#226032
質問者

お礼

>>>こんかいはそもそも条件式でないのでこのようにならない。 console.log(~)の帰り値がundefinedだったとしても条件式です。 つまり、もしconsole.log(~)の帰り値がundefinedだったとしたら 「x ===1 && console.log('こんにちは')」は「x ===1 && undefined」と等価となります、( 結果的にエラーだったとしても)これでも条件式です。 比較演算子、論理演算子などがある場合は、IF()のようになっていなくても条件式なのですね。 ただ条件式だったとしても下記はXが1だった時のみ右側を実行する。1出なかった場合は実行しないという結論は正しいのですね。 x ===1 && console.log('こんにちは'); IF(x ===1 && console.log('こんにちは'); ) だったら両方が正しかった時のみ実行するとなりますが、()に囲まれていないときは、 左が正しかった時だけ右を実行するという形に変わると暗記するしかないのですかね。 どう区別するのでしょうか?

回答No.9

>>&&はかつ、andの意味と聞いていますが、この場合もこの意味でしょうか? >それは論理演算子です、「true、false 」の どちらかの値になります。 それは論理演算子で、&&は「かつ、and」の意味です、「true、false 」の どちらかの値になります。 JavaScriptの場合、ショートサーキット評価されます。 >ショートサーキット評価の性質を利用して「if (x === 1) { console.log('こんにちは'); } 」と同様の動作を実現しています。 論理演算子の&&(and)を使いショートサーキット評価の性質を利用して「if (x === 1) { console.log('こんにちは'); } 」と同様の動作を実現しています。

noname#226032
質問者

お礼

ショートカット演算(短絡演算) 以下の❶❷は意味的に等価です。1と2は違う式だが同じ結果になるということ。 if (x === 1) { console.log('こんにちは'); } ← ❶ else省略している。真だった時だけ{}ないを実行する。 もしxが数値の1だったらこんにちはと出す。 そうでなかった場合は何も表記されない。 偽は省略されている。 x ===1 && console.log('こんにちは'); ← ❷ 真だった時(xが数値の1だった場合)だけ&&以降を実行する。条件式ではないケースなので、両方当てはまった場合何かを実行するわけではない。 偽だった時(xが数値の1以外だった場合)は&&以降は実行されない。つまり何も表記されない。 条件式の場合はこのようになる。 xが数値の1かつ、こんにちだったら。  こんかいはそもそも条件式でないのでこのようにならない。 &&はかつ、andの意味と聞いていますが、この場合もこの意味でしょうか? ❶と❷は「意味も書き方も全然違うが、実行した結果が、偶然、同じになる」のです。 ありがとうございました。上記の認識でよいですね。

回答No.8

>&&はかつ、andの意味と聞いていますが、この場合もこの意味でしょうか? それは論理演算子です、「true、false 」の どちらかの値になります。 JavaScriptの場合、ショートサーキット評価されます。 >x ===1 && console.log('こんにちは'); >xが数値の1かつ、こんにちだったら?? 「xが数値の1かつ、console.log(~)」だったらと言う事です。 >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」なら「console.log(~)」は実行される、と言う事です。 ショートサーキット評価の性質を利用して「if (x === 1) { console.log('こんにちは'); } 」と同様の動作を実現しています。

  • f272
  • ベストアンサー率46% (8477/18147)
回答No.6

#2です。 > ・条件式以外で使う論理演算子 > すべてがtrueの場合はtrue返す。 > 左から順にfalseが出るまで処理を行いfalseが一回でも出れば、それ以降の処理は行わずfalseを返す 1.「条件式以外で使う」と限定しなくても,どこで使用しても同じです。 2. 上に書いたようなことは&&のときに限ります。 3. 詳しく言えばtrueやfalseではなくて,trueやfalseとみなせるものです。

関連するQ&A