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

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

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

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

Q&A

解決済

5回答

1327閲覧

javascriptのfor文の条件について

hidegital

総合スコア14

JavaScript

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

0グッド

1クリップ

投稿2018/01/15 10:32

javascript

1for(let i = 0; i < 10; i ++) { 2...処理 3} 4 5

for文の条件について
i < 10未満と書かれている物が多いですが理由があるのでしょうか?

<=や==などの比較演算子を使用しない方が良いなどありましたらご教授いただけると
幸いです。

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

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

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

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

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

guest

回答5

0

ベストアンサー

配列が0オリジンなので、最後のインデックスは長さより1少なくなります。結果、i < arr.lengthというかたちで条件を書くことがよくあります。

もちろん、「1から9まで回したい」場合にfor(i = 1; i <=9; ++i)と書いても、全く問題ありません。

投稿2018/01/15 10:48

maisumakun

総合スコア145183

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

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

hidegital

2018/01/16 07:00

simpleでわかりやすかったのでベストアンサーにしました。 ありがとうございます。
guest

0

もともと配列の場合、添え字は0から始まるのが古来よりの作法です。
これは配列が実際にはメモリブロックであること、そして配列の要素へのアクセスが、「配列の先頭アドレスと、そこからの要素数によるオフセット」であることから、配列の先頭を 0 としたほうが素直になるからです。
このため、配列の最大の添え字数は、要素の総数 - 1 となります。
それを踏まえると、for で配列を処理する場合、< {要素総数} の方が、<= {要素総数-1} より(コードを読む人が)直感的にわかりやすいのです。

ちなみにパフォーマンスから言えば、ほとんどの CPU は数値の比較処理において < と <= と、どちらも対応する命令がある(x86 系でいえば CMP のあとが JB か JBE になるだけ)ため、パフォーマンスに違いが出るようなことはありません。

投稿2018/01/16 00:05

tacsheaven

総合スコア13703

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

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

0

forでカウンタをインクリメントしながらn回まわす処理はいくつか考えられます

for(var i=0;i<n;i++)
for(var i=0;i<=n-1;i++)
for(var i=1;i<=n;i++)
for(var i=1;i<n+1;i++)

iが0から始まる限りi<nが一番スマートなのでこの形式が定着したのだと思います

投稿2018/01/16 00:20

yambejp

総合スコア114777

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

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

0

i < 10

i < 10未満と書かれている物が多いですが理由があるのでしょうか?

説明の為の例示としては多いかもしれませんが、実用のコードを書く際には 10 等の固定値を書くことは、あまりありません。
固定値にしてしまうと汎用性が犠牲となる事が多い為、array.lengthmap.size 等を変数に格納して、条件式を決定します。

< と <= の違い

<=== などの比較演算子を使用しない方が良いなどありましたらご教授いただけると幸いです。

<= は~~「<== の複合型」~~「> の反意」なので、< でも要件を満たせる場合はパフォーマンス上の理由で < を採用する事があります。
最終的にはケースバイケースなので、狭い視野にとらわれず、柔軟に対応していくべきだと思います。
<=== は使用しても良い演算子です。

個人的には == は型変換規則が複雑化する元なので、=== を採用します。

(2018/01/16 11:55追記)
「< と == の複合型」については間違いでしたので、訂正しました。

パフォーマンスについても遅くなると言う理由が見当たりません。

< が単一条件なのに対して、<= がOR条件になってしまうという意味です。

上記仕様から引用しますと、下記が < の手順。

RelationalExpression:RelationalExpression<ShiftExpression
...(中略)...
7. If r is undefined, return false. Otherwise, return r.

下記が <= の手順です。

RelationalExpression:RelationalExpression<=ShiftExpression
...(中略)...
7. If r is true or undefined, return false. Otherwise, return true.

step7 で <= は true or undefined の2つの条件を指定していますが、< は一つの条件で良い。
従って、r 値が true である限りは両者のパフォーマンスは同等ですが、undefined であった場合にわずかながら < の効率が良い計算となります。

Re: hidegital さん

投稿2018/01/15 14:49

編集2018/01/16 02:57
think49

総合スコア18162

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

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

think49

2018/01/16 02:58

> `<=`は`>`の逆の結果を返すと言うだけで、 仰る通りでしたので訂正しました。 > パフォーマンスについても遅くなると言う理由が見当たりません。 親記事に追記しました。
guest

0

他の回答が正解だと思うので、この回答は蛇足です。

javascriptにはint型がないので、0に1を9回足して9ぴったりになる保証はないのではないかな、などふと不安になることがあります。もちろん杞憂なのでしょうけど。
たとえば、9.0000000000001とかになったらどうしよう、みたいな。

予想外に1回多い分には例外が投げられたり値がundefinedになったりするので分かりやすいですが、予想外に1回少ないのは気づきにくいバグになりそうで。

いや、こういうことを言い出すときりがないのはわかっているんですけどもね。

投稿2018/01/16 00:23

Lhankor_Mhy

総合スコア36074

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

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

ozwk

2018/01/16 00:38

浮動小数点数の有効桁数で収まる整数なら正確に表せるので大丈夫かと。
arasi

2018/01/16 03:03

変なことを言って質問を混乱させる
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問