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

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

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

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

JavaScript

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

Q&A

解決済

7回答

1510閲覧

JavaScriptのif入れ子について

unix-yuto

総合スコア8

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

JavaScript

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

3グッド

0クリップ

投稿2018/06/13 22:35

初心者なので拙い文章ですいませんm(_ _)m
JavaScriptでifの中にifを入れる場合、中に入れるif、else ifの数に制限などはあるのでしょうか?

Lhankor_Mhy, sota_u, ikadzuchi👍を押しています

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

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

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

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

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

m.ts10806

2018/06/13 23:09 編集

文章が拙いのは仕方ないところもありますが、内容が拙いのはこういう技術系質問サイトではマナー・ルール違反です。
Lhankor_Mhy

2018/06/14 00:12

そうですか? これはよい質問だと思いますが。
m.ts10806

2018/06/14 00:23 編集

「調べてこういう記事を見つけた(やってみた)が分からない(その内容が質問に書いてある)」ならまだ分かりますが。
think49

2018/06/14 12:42

「範囲が広すぎる」「自分の意見をいわない」という意味では回答者のリスクが不本意に高い質問だとは思います。 最悪のケースとして「それは私が求めている答えではありません」「それは知っていました(別の回答をBA)」「やっぱり、そうなるんですね(その回答を仕方なくBA)」な返信が想像できます。
guest

回答7

0

ベストアンサー

JavaScriptでifの中にifを入れる場合、中に入れるif、else ifの数に制限などはあるのでしょうか?

技術的制約はありませんが、可読性の観点から深いネストは敬遠されます。

Re: unix-yuto さん

投稿2018/06/13 23:20

think49

総合スコア18156

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

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

m.ts10806

2018/06/14 00:28

> ネストの深さは闇の深さ 覚えがありすぎる。。。
miyabi_takatsuk

2018/06/14 00:37

> mts10806さん 禿同です笑 あと僕の場合、三項演算子使いすぎで、わかりにくいって言われた逆パターンもあります 笑
guest

0

js

1var i = 0 2if (++i) 3if (++i) 4if (++i) 5//... 6if (++i) 1; 7console.log(i);

試してみたところ、当方の環境(win7、Firefox60)ですと、3010を超えるとスタックが溢れてエラーになりました。
また、

js

1var i = 0 2if (++i) 3if (++i) 4if (++i) 5//... 6if ( (++i) ) 1; 7console.log(i);

としてみたところ、3010でもエラーになりましたので、if文以外のスタックやその他メモリの状況に左右されるかと思います。

投稿2018/06/14 09:28

Lhankor_Mhy

総合スコア35869

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

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

0

あまり意識していない方も多いですがjavascriptにはelseifという構文がありませんので
常に真偽のどちらかの判定しかしていません。
「else if」は実際には「else{if(){ ・・・}}」というelseのブロックの中でifを
ネストしているにすぎません。
なので論理的にはネストを気にするのはあまり意味がなく、あくまでも見た目上のネストだけ
気にしたほうがいいという認識がよいと思います

投稿2018/06/14 01:11

編集2018/06/14 01:32
yambejp

総合スコア114581

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

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

miyabi_takatsuk

2018/06/14 01:21

し、知らなかった・・・。 確かに、{}でブロック分けしなくても動くってことは、そういうことですもんね。 勉強になりました。 横槍失礼しました。
think49

2018/06/14 12:51 編集

> 「else if」は実際には「else{if(){ ・・・}}」というelseのブロックの中でifを > ネストしているにすぎません。 ネストしているわけではありません。 この事例では BlockStatement -> IfStatement 内の BlockStatement の形でネストしていますが、IfStatement の構文は if (Expression) Statement else Statement であり、else に後続する Statement が IfStatement を含むことが出来る事で、再帰的に IfStatement を呼び出し、 if (Expression) Statement else IfStatement となり、 if (a) {} else if {} が成立します。 おそらく、yambejp さんは理解しているのであろうと思いますが、-評価の理由は「ネスト」という単語を使ったことにあるようにも感じています。 http://www.ecma-international.org/ecma-262/8.0/#sec-if-statement
guest

0

まず、最近のコンピュータは性能が高いので、何か上限があったとしても実用上問題が起こることはまずありません。

その上で、原理的に上限がありうるかという点について考えます。
if文のネスト(入れ子)ですが、単純に考えると、内部的にそのようなものは存在しません。
if文の開始部分が「条件判定し、満たされないなら、if文の終了地点へ飛ぶ(goto)」という動作で、if文の終了地点には何もありません。
なのでif文にネストになるような構造はそもそも無いのです。

ただ、スコープを切り替えたり何らかの最適化のためにif文のネストが何らかの意味を持つことも考えられます。
その場合であっても、JavaScriptが動くレベルのCPUなら、固定のスタックを食いつぶしてメモリ全体の制限より早く限界が来るみたいなことはないのではないかと思います。


【追記】
上記のように考えていたわけですが3000程度で上限に達するとは予想外でした。すみません。
私も試してみましたが数は違うもののどのブラウザでも(Firefox,Chrome,IE,Edge)千や万単位でメモリ不足や再帰の上限でエラーになりました。
この程度のネスト数でメモリ不足になる理由は私には分かりません。

投稿2018/06/14 01:22

編集2018/06/16 19:03
ikadzuchi

総合スコア3047

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

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

miyabi_takatsuk

2018/06/14 01:38

横槍失礼します。 やってみて動き確認してみましたが、そういうことなんですね。 ブロックで分けるのは、あくまで後の処理に影響を及ぼさないためにつけるだけであって、 本来的には、ifの仕様としては入れ子の概念は存在しないんですね。 大変勉強になりました。
guest

0

試してみてはいかがでしょうか。

動くサンプル:https://jsfiddle.net/eb23wszf/


【Chrome DevToolsを使いこなそう! Web開発に必須なブラウザ開発ツールによるデバッグの基本 - エンジニアHub|若手Webエンジニアのキャリアを考える!】
https://employment.en-japan.com/engineerhub/entry/2017/05/30/110000#Consoleパネル

投稿2018/06/13 22:59

kei344

総合スコア69364

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

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

0

構文チェックをしてくれるeslintの中にcomplexityというルールがあり、
そのデフォルト設定は『20』となっています。
もしかしたらこの数字は、世界のエンジニアの心の叫びを集約した数字かもしれません。
日頃から他人に優しいコードを書くように心掛けたいと思います。
(他人というのは1年後の自分も含みます・・・)

投稿2018/06/19 06:54

himejiy3

総合スコア77

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

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

0

ifやelseの数や制限については、他の方が答えてらっしゃるので、別角度から。

else if を複数以上使う場合、switch構文の方が、よかったりします。
例えば下記のようなパターン

変数juiceに、なんのジュースが入ってるかを判別する時とかです。

javascript

1var juice = 'オレンジ' 2// ↑ここでは決め打ちですが、juiceに何が入ってるかわからないとします。 3 4switch(juice){ 5 case 'オレンジ': 6 console.log('うーまいー!'); 7 break; 8 case '抹茶': 9 console.log('苦い・・・'); 10 break; 11 case 'レッドブル': 12 console.log('飲みすぎないように'); 13 break; 14 default: 15 console.log('なんだこれ?'); 16 break; 17}

あと、ifが一行で値だけが変化するって時は三項演算子を使うと、ネストが抑えられるかと思います。

javascript

1var hogehoge = true 2// ↑trueかfalseが入ってる変数とします。 3 4var message = hogehoge ? 'ほげほげいるよ' : 'ほげほげいない!'; 5// hogehogeがtrueだと左側、falseだと右側を使います。 6 7if (message.indexOf('いない') != -1) { 8 // messageに”いない”って文字列が入ってると、下記が実行されます 9 console.log('いないらしい・・・'); 10 return false; 11} 12 13

ちょっと、質問と趣旨が変わってしまってすみませんが、
switch構文や、三項演算子をうまく使えば、else ifも、ifのネストもけっこう抑えられるかと思います。

お役に立てられれば幸いです。

投稿2018/06/14 00:58

miyabi_takatsuk

総合スコア9528

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問