JavaScript
1 var o = {x:1, y:2, z:3}; 2 var a = [], i = 0; 3 for(a[/*here*/] in o) 4 document.write(a);
###質問1)/here/に入る数字は何を表していますか?
0,1,2,3と数が大きくなるにつれ
xyz
,x,y,z
,,x,,y,,z
とカンマが表示されます
###質問2)なぜx,yと出力されるのでしょうか?
0,1,2,3と数が大きくなるにつれ
xyz
,x,y,z
,,x,,y,,z
とカンマが表示されます ( for(a[/here/] in o)の後ろに;がないため毎回書き出されます)
/here/がi++のとき、2回目のループはi++は1ですよね?
/here/が1のとき、どのループも,x 、,y、 ,z、 のようにカンマと一つの数値
なのになぜx,yと出力されるのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
掲示したコードは SyntaxError
になります。
コードを投稿する前に実行して正しく動くことを確認してからコピペして質問してください。
JavaScript
1var o = {x:1, y:2, z:3}; 2var a = [], i = 0; 3 4for (a in o) { 5 document.write(a); 6}
上のコードだとして、a
はオブジェクトの「プロパティ名」を表します。
基本的な文に関してはリファレンスを読むといいと思います。
for-in における {} の省略
for-in
文では {}
を省略する事で後述する一つの文(Statement)を処理しますが、基本的には {}
で括ることをお勧めします。
大抵のコーディング規約では {}
の省略は禁止されますし、バグの元となります。
しっかりと理解して書く分には問題ないともいえますが、勉強中なら省略するメリットがないと思います。
(2015/11/03 23:21追記)
Javascriptのオブジェクトについて(19181)|teratail のコードを元に次のコードを考察します。
JavaScript
1var o = {x:1, y:2, z:3}; 2var a = [], i = 0; 3 4for (a[i] in o) { 5 console.log(a); 6 console.log(i++); 7}
a[i]
は繰り返し評価され、a[i] = propertyName
が実行されます。
先のコードは下記コードとほぼ等価です(厳密には違います)。
JavaScript
1for (var i = 0, l = keys.length; i < l; i++) { 2 a[i] = keys[i]; 3 console.log(a); 4 console.log(i); 5}
console.log
については開発者ツールを使って下さい。
テストコードについては document.write
よりも有用です。
(2015/11/04 06:32追記)
等価コードを書き換えました。
投稿2015/11/03 12:51
編集2015/11/03 21:32総合スコア18156
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2015/11/03 13:00
2015/11/03 13:05
退会済みユーザー
2015/11/03 13:10
2015/11/03 14:43
2015/11/03 16:44
2015/11/03 17:20
2015/11/03 21:33
退会済みユーザー
2015/11/04 01:33
2015/11/04 01:37
2015/11/04 01:41
0
ベストアンサー
他の方の投稿とそこでのやり取りを見た感じ、配列がどういうものなのかということのように思います。
配列は、変数をまとめて扱っているものです。
a[0],a[1],a[2]これらはそれぞれ別々の変数と考えてください。
a[2] = "z" これはa[2]という名前の変数に、文字"z"を代入しています。
[]この中に変数を書いても、それが展開されて参照されるというだけのものです。(厳密には違いますが、イメージとして) 「a[1]」と i=1;での「a[i]」は同じ変数にアクセスします。
(なんでa[数値]のように書くのかというのは、もうそういうルールだからです。)
ここまでなら配列に意味はないのですが、プログラムでは複数の変数に連続アクセスしたい場合が多々あります。
aa="x"; bb="y"; cc="z"; のように代入していたなら、xyzと書き出すのに例えば
document.write(aa);
document.write(bb);
document.write(cc);
他にも方法はありますが、概ね変数の個数分アクセスが必要です。
変数の数が数十、数百になってくるとやってられませんが、配列なら
a[0]="x"; a[1]="y"; a[2]="z";
for(i=0,i<a.length,i++){
document.write(a[i]);
}
このように少量のコードで対応できます。
これはiを0から配列aの要素数になるまで1加算しながらループをまわします。
それで都度a[i]を出力しています。i=2の時は a[2]となりますが、これはa[2]という変数を出力しています。
for(a[0] in o)
for(a in o) の違いは何ですか?
for(a[0] in o){} は、「変数a[0]に」oの要素名を順番に呼び出して上書きします。
for in のルールでoの要素数回実行されます。
最終的にa[0]は"z"になるでしょう。途中"x"や"y"になりますが、使うまもなく"z"に上書きされるので意味はありません
for(a in o){} も、「変数aに」oの要素名を上書きするだけです。やってることは変わりません。
最終的にaは"z"になるでしょう。途中"x"や"y"になりますが、使うまもなく"z"に上書きされるので意味はありません
そんで i=0; for(a[i++] in o){} これはどうかというと、ループが進むたびにiの値が増えるので、a[i]が示す変数がa[0]->a[1]->a[2]と毎回変わります。
それでここまで書いてなんですが、for(a[i++] in o)console.log(a[i]); もあまり研修目的で触れるような使い方ではないと思います。連想配列oのキー名を配列aにコピーすることに意味があるならいいのですが…。
※常に無意味ではありませんが、説明もなくこれが登場しても、何故そんなことを今しているのか分かりにくいです。
多分普通はこんな使い方でしょう。
o={"HP":200,"MP":50,"ATK":10,"DEF":5};
for(key in o){
console.log(key + " : " + o[key]);
}
// HP : 200
// MP : 50
// ATK : 10
// DEF : 5
keyの値はoのキー名が順次上書きされて最終的に"DEF"になるだけですが、ループの中で都度o[key]にアクセスしています。
投稿2015/11/03 15:47
編集2015/11/03 15:56総合スコア2068
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2015/11/03 16:34
2015/11/03 18:42 編集
退会済みユーザー
2015/11/03 22:50
2015/11/04 00:40
退会済みユーザー
2015/11/04 00:53
2015/11/04 01:04
2015/11/04 01:08 編集
2015/11/04 01:27 編集
2015/11/04 01:26 編集
退会済みユーザー
2015/11/04 01:32
2015/11/04 01:58 編集
退会済みユーザー
2015/11/04 02:09
2015/11/04 02:21 編集
2015/11/04 03:25 編集
退会済みユーザー
2015/11/04 03:31
2015/11/04 04:14
退会済みユーザー
2015/11/04 04:37
0
単純に、データ型や処理が分かっていらっしゃらないのだと思います。
>for(a[0] in o)
>for(a in o) の違いは何ですか?
まず、きちんとした理解が出来なくなるので、
他の方同様、標準的な書き方を覚えた方が良いと思います。
という事はさて置き、他の言語でも同様のforeachと呼ばれる処理ですね。
for (変数A in コレクションB){
変数Aの処理
~
}
単純に、コレクションBから一つずつ取り出して変数Aに入れて、
コレクションがなくなるまで繰り返すという処理です。
a[0]は、配列変数aの0番目という事です。
aは、変数aと言う意味です。
このfor in(他言語でforeach)の使い方ですが、
基本的に、for文で、配列変数を使いたくないという思考から産み出された処理となります。
ですので、よほど特殊な処理でもなければ、a[0]を使う意味は全くないという事なんです。
※他言語ではforeachとなりますので、以下foreachと記述します。
使用頻度は、ほぼ皆無でしょうが、
例えば、1番目の値を取っておいて後でforeach処理の中で、その値を使用したいという場合などに配列変数で取っておくという事は考えられますが、処理が煩雑となりますので、まず普通はそのような記述はしませんね。
もし、一つ前の値を取っておいてとの事ならば以下のようなロジックになるかと思います。
変数C=""
for (変数A in コレクションB){
変数Cと変数Aが同じ文字列か調べる
同じであれば ~の処理
違えば ~の処理
変数C = 変数A
}
JavaScriptは、残念ながら、明確な公式コーディング規約(標準的な書き方)という物があまり存在していない言語で、言語としての制約もかなり甘いので、本当は、JAVAなどから始められると体系的に身につくのですが・・・。
因みに、多数のネットや書籍による書き方は、かなり適当で怪しいと言わざるを得ませんね。
(参考)
Mozilla/Firefox JavaScript標準コーディング
https://developer.mozilla.org/ja/docs/JavaScript_style_guide
追伸
document.write(a)
の意味をいまいち、掴み切れていないのだと思います。
変数aの場合は、aの値を表示しろ。
配列変数aの場合は、配列変数aの全ての値を表示しろ。
同じ「document.write(a)」ですがデータ型が違いますので意味が異なります。
投稿2015/11/03 15:43
編集2015/11/03 16:53退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2015/11/03 16:37
退会済みユーザー
2015/11/03 17:05 編集
退会済みユーザー
2015/11/03 23:32 編集
退会済みユーザー
2015/11/04 00:51
2015/11/04 01:17 編集
退会済みユーザー
2015/11/04 01:49
退会済みユーザー
2015/11/04 02:01
0
javascript
1for(a[i++] in o){ 2 document.write(a); 3} 4for(a[1] in o){ 5 document.write(a); 6} 7
この違いですかね
i++ の方ですが
1回目のループ
i = 0
a[i++] = 'x' ここでは、a[0] = 'x'、 i = 1 になります
a を表示 a[0] のみなので 'x' が表示される
2回目のループ
i = 1
a[i++] = 'y' ここでは、a[1] = 'y'、 i = 2 になります
a の要素数は2個 a[0] = 'X' 、a[1] = 'y' です
a を表示 a[0] ,a[1] を表示するので、1回目の表示'x' の後に 'x,y' が表示される
3回目のループ
i = 2
a[i++] = 'z' ここでは、a[2] = 'z'、 i = 3 になります
a の要素数は3個 a[0] = 'X' 、a[1] = 'y' 、a[2] = 'z' です
a を表示 a[0] ,a[1],a[2] を表示するので、1・2回目の表示'xx,y' の後に 'x,y,z' が表示される
結果 'xx,y,x,y,z'の表示になる。
a[1] の場合
1回目のループ
a[1] = 'x'
ここでは、aの要素数は2個、a[0] = ''、a[1] = 'x'
a を表示 a[0] ,a[1] を表示するので、'□,x'(□は空です。)
2回目のループ
a[1] = 'y'
ここでも、aの要素数は2個、a[0] = ''、a[1] = 'y'
a を表示 a[0] ,a[1] を表示するので、1回目の表示'□,x' の後に'□,y'(□は空です。)
3回目のループ
a[1] = 'z'
ここでも、aの要素数は2個、a[0] = ''、a[1] = 'z'
a を表示 a[0] ,a[1] を表示するので、1・2回目の表示'□,x□,y' の後に'□,z'(□は空です。)
となります。
こんな説明で解りますかね
投稿2015/11/03 14:39
総合スコア366
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2015/11/03 16:54
0
多分以前投稿された
for(a[i++] in o)
の事ですかね
私はあまりこの書き方はお進めしませんが
以下の流れであってると思います。
1回目のループ
a[0] = o配列 の最初の文字 'x' が代入される
表示は「x」]
2回目のループ
a[1] = o配列 の2番目の文字 'y' が代入される
表示は「xx,y」 (最初に表示された'x'の後に、a の中全て(x,y)が表示される)
3回目のループ
a[2] = o配列 の3番目の文字 'z' が代入される
表示は「xx,yx,y,z」 (2回目に表示された'xx,y'の後に、a の中全て(x,y,z)が表示される)
a[i++] は a[i] に o のプロパティを代入しています。
i は 代入後 +1 されています。
また、think49さんも記載していますが
{} は付けたほうが良いと思います。
どこから、どこまでがループなのかをわかりやすくする為です。
投稿2015/11/03 13:29
総合スコア366
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2015/11/03 13:38
2015/11/03 14:04 編集
退会済みユーザー
2015/11/03 14:05
2015/11/03 14:09
退会済みユーザー
2015/11/03 14:16
2015/11/03 14:19
退会済みユーザー
2015/11/03 14:27
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。