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

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

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

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

Q&A

解決済

5回答

2383閲覧

if文内の処理が実行されない原因が分かりません

aae_11

総合スコア178

JavaScript

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

0グッド

0クリップ

投稿2019/08/15 02:25

以下のコードにつきまして、お聞きしたい点がございます。

<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script></script> <style> #content_box{ margin:100px auto; width:300px; height:300px; border-radius: 50%; background-color:red; border:1px solid red; display:flex; flex-direction:column; justify-content:center; align-items:center; box-shadow:0 10px 0 #d1483e; cursor:pointer; } #content{ text-align:center; font-size:50px; font-weight: bold; color:#fff; } #content_box:hover{ opacity:0.9; } </style> </head> <body> <button id="content_box"> <p id="content">?</p> </button> <script> document.addEventListener('DOMContentLoaded',function(){ let data = document.getElementById('content_box'); data.addEventListener('click',function(){ let search_data = document.getElementById('content').textContent; // console.log(search_data); let items = ['凶','吉','末吉','中吉','大吉']; let result = items.indexOf(search_data); console.log(result); if(!result == -1){ console.log(result); items.splice(result,1); } let random = Math.floor(Math.random() * items.length); document.getElementById('content').innerHTML = '<p class="content">' + items[random] + '</p>'; },false); },false); </script> </body> </html>

上記コードのbutton要素をクリックしたら、クリックイベントへと遷移しますが、その際、初回のクリック以外の場合は、変数「result」に「-1」以外が挿入されますが、if文内が実行されない状況です。
if文の前で、resultをconsole.logに出力させてみた所、整数が格納されていることの確認が取れました。
何故if文内の処理が実行されないかが分からない為、ご教示頂けましたら幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

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

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

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

guest

回答5

0

ベストアンサー

!result == -1は、==より前に!が解釈されて、「!result-1と等しいかどうか」という意味になってしまいます(!resulttrueもしくはfalseになりますので、==-1と比較した場合、一致しません)。

素直にresult != -1とするか、単項!を使いたければ!(result == -1)と、演算順序を明示しましょう。

投稿2019/08/15 02:29

maisumakun

総合スコア145184

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

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

maisumakun

2019/08/15 02:34

==を論理否定する場合は!=を使えばいいのですが、現実的にハマりやすいパターンとして「key in obj」の否定は「!(key in obj)」と括弧が必要になります。
aae_11

2019/08/15 02:34

ご回答ありがとうございます。 何故、if文内が実行されないかが理解できました...
guest

0

演算子の優先順位を抜粋します。

優先順位演算子の種類結合性演算子
16論理 NOT右から左! …
10等しい左から右… == …

演算子の優先順位 - JavaScript | MDN

以上のとおり、否定!が比較演算子==より先に処理されるのが原因です。

投稿2019/08/15 02:37

Lhankor_Mhy

総合スコア36117

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

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

aae_11

2019/08/15 02:42

ご回答ありがとうございます。 分かりやすく、勉強になりました。
guest

0

!result == -1
では、先に!resultが計算され、
true == -1
を計算しています。
その結果falseとなり、if文が実行されません。
なので、
if(!(result == -1)){
とすれば希望通りの結果になるのではないでしょうか?

あと、下に演算子の優先順位が記載されたurlを載せておきます。優先順位が高いものから順に実行されますので、記述の際は注意しておいたほうがいいかもしれません。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Operator_Precedence

投稿2019/08/15 02:36

yuuyu

総合スコア1139

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

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

aae_11

2019/08/15 02:41

ご回答ありがとうございます。 そうですね..勉強不足で条件式にかんして、勘違いしてしまっていました...
guest

0

if(!result == -1){

resultの論理否定してますが、これでは0か1にしかならないので、このifの論理式は、常にfalseとなります。
これではこのナカミが実行されることはありません

もしかして、
if( result != -1){}
ってことがしたいのかな?

投稿2019/08/15 02:31

y_waiwai

総合スコア87774

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

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

aae_11

2019/08/15 02:37

ご回答ありがとうございます。 >if( result != -1){} ってことがしたいのかな? そうですね。このようにしたかったのですが、勘違いしてしまっていました...
guest

0

JavaScript

1if(result != -1){ // == じゃなくて != じゃだめ? 2 console.log(result); 3 items.splice(result,1); 4}

これでも実行されませんか?

投稿2019/08/15 02:30

azuapricot

総合スコア2341

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

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

aae_11

2019/08/15 02:36

ご回答ありがとうございます。 if(result !== -1)このように修正しましたら、無事if文内の処理が実行されました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問