ここから本文です

JavaScriptの勉強を始めたばかりです。 いくつかの数字を、コロンで区切って適当...

おとふとさん

2014/12/520:38:40

JavaScriptの勉強を始めたばかりです。
いくつかの数字を、コロンで区切って適当な数テキストボックスに入力した時に、それを全て足すというプログラムを作ろうとしています。

input type="text"で、valueに入力した数字は文字列として認識されるので、
.split(":")を使ってそれぞれの数字をa[0],a[1],a[2],a[3],....というふうにしたあとで、
a[0]=a[0]-0;
a[1]=a[1]-0;
a[2]=a[2]-0;....と一個一個数値に変換しようとしましたが、
下の文で実行すると、実行ボタンを押した時に固まってしまいました。
理由を教えてください。

<head>
<script type="text/javascript">
<!--
function gok(){
a=document.f.a.value.split(":");
i=0;
k=0;
while(1){
if(a.length>=i){
a[i]=a[i]-0;
k=k+a[i];
i=i+1;
}
else break;
}
window.alert(k);
}
//-->
</script>
</head>
<body>
<div align="center">
<form name="f">
<input type="text" name="a" placeholder="コロンで区切って入力">
<input type="submit" value="計算実行" onclick="gok()">
</form>
</div>
</body>

閲覧数:
56
回答数:
2

違反報告

ベストアンサーに選ばれた回答

2014/12/523:51:56

--- 蛇足 ---
送信しないのに、form 要素を使うのは、意味のないことです。

document.f.a.value
この表記は古いです。
document.forms['f'].elements['a'].value
の方がましですが、そもそも name属性 も、もう古いです。

align なんかも、最近ではスタイルシートを使ってやります。

もう、<!-- //--> を書かないといけないようなブラウザは、かなり少数ですよ。


--- 本題 ---
こういう場合は、大抵 for 文を使うと思いますが、while 文 でも良いでしょう。

また、ループするたびに、毎回 a.length を参照していることに気付いてください。
毎回毎回 a.length を求めているので、かなり無駄のあるコードとなってしまっています。

while (1) は、意図的ですか。
素直に、while (a.length>=i) で良いのでは。
同義です。

i = i + 1 は、i++ や ++i と書けます。(i++ と ++i には、大きな違いがありますが、ここでは説明しません。)
k = k + a も、k += a と書けます。

  • 2014/12/600:02:22

    さらに、a[i] = a[i] - 0 としてしまうことにより、無駄に a という配列を変化させています。
    あと、var 宣言をして下さい。
    var 宣言をしないと、グローバル変数として定義されてしまいます。
    それから、k では変数の意味が分かりません。
    和なら、和らしく sum とかにしてはどうでしょうか。(以下の例では k のままです。)

    まとめると、以下のようなコードなら、うまく動くでしょう。
    なお、元の条件に、a.length>=i としていますが、i = a.length のとき、a[i] は、a の最後の要素の次ですから、存在しません。

    var i = 0, k = 0, length = a.length;
    while (length > i) {
    k += a[i] - 0;
    i++;
    }

  • その他の返信(1件)を表示

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

質問した人からのコメント

2014/12/6 10:26:11

降参 ありがとうございました。.lengthの使い方が理解できていなかったようです。

ベストアンサー以外の回答

1〜1件/1件中

ano********さん

2014/12/522:18:02

ループを継続するか否かの条件が、

a.length>=i

だと、例えば「1:2」の入力に対して、a.lengthは2ですから、
i=0,1,2についてa[i]を評価しようとしてしまいます。
正しくa[0],a[1]だけ評価させるなら、

a.length>i

のような条件でないといけません。

ちなみに、個人的には、そのコードに近い形で書くのなら、

while(1){
if(i>=a.length)break;
a[i]=a[i]-0;
k=k+a[i];
i=i+1;
}

のように、先頭でループの終了条件を記述してbreakする方が好みかも。
{}のネストも深くなりませんし。

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる