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

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

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

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

Q&A

解決済

5回答

1739閲覧

JavaScriptのfor in文について

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

0グッド

0クリップ

投稿2015/11/03 12:29

編集2015/11/03 22:54

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ページで確認できます。

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

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

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

think49

2015/11/03 17:14

質問文を編集するのならコード上の for(a[/*here*/] in o) を修正して下さい。 for(a[i++] in o) ではないのでしょうか。 それから、document.write よりも console.log を使用して下さい。 a が配列であることが分かると思います。 https://teratail.com/questions/19270#r30077 で同様の回答をしていますが、気が付いていないのでしょうか。
guest

回答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
think49

総合スコア18156

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

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

退会済みユーザー

退会済みユーザー

2015/11/03 13:00

上記コードは/*here*/に値を入れなければエラーになるので そこの値はどんな意味を持っているか?という疑問を上げた質問です 紛らわしくてごめんなさい。
think49

2015/11/03 13:05

「値を入れる」とは for (a[i] in o) ですか? 受け取り方に相違が発生する元なのでコピペするだけで動くコードを書いてください。
退会済みユーザー

退会済みユーザー

2015/11/03 13:10

すいませんでした。 もともとi++というものが入っていて、iは引数なので数字を入れても問題なく実行できると思い数字を入れました for(a in o);はo(オブジェクト)のプロパティ名をaに与えるというのがfor in文ですが、 for(a[/*here*/] in o)のとき/*here*/に入る値はどのように影響するのでしょうか?
think49

2015/11/03 14:43

親コメントに追記しました。
think49

2015/11/03 16:44

/*here*/ には何も入りません。 入るのは a[i] だけであり、i の値は明示的に代入しなければ永久に変わりません。
think49

2015/11/03 17:20

x, y, z と増えていくのは、for (a[i] in o) の左辺式で「a[i] = propertyName」のような代入処理が繰り返し行われているからです。 配列は document.write で出力される時にカンマ区切りの文字列に変換されます。
think49

2015/11/03 21:33

等価コードを書き換えました。
退会済みユーザー

退会済みユーザー

2015/11/04 01:33

以前の疑問と今の疑問は違います。 純粋にa[]の意味が分からないのです
think49

2015/11/04 01:37

以前の質問と違うことは理解しています。 親コメントに書いたように for (a[i++] in o) は a[i] = keys[i]; の代入処理が行われています。 for-in は i に変更は加えませんので i++ のみの変更が加えられます。
think49

2015/11/04 01:41

言葉を変えるならば、a[i] でも b[i][x] でも a.name.hoge でも同じです。 for-in は左辺式に代入処理を行うだけで左辺式そのものに意味はありません。
guest

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
hirohiro

総合スコア2068

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

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

退会済みユーザー

退会済みユーザー

2015/11/03 16:34

丁寧なご回答ありがとうございます /*here*/に入る数字は何を表していますか? 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と出力されるのでしょうか?
hirohiro

2015/11/03 18:42 編集

>>/*here*/に入る数字は何を表していますか? aに所属する変数の何番目かを示しています。a[1]はa配列に所属する2番目(0から始まるので)の変数です。 そもそも「document.write(a);」この記述が特殊です。 a[]を単にaと参照した場合、配列の先頭アドレスが参照されているに過ぎません。a[0],a[1],a[2]は独立した別の変数なので、本来このように書かれるべきなんです。 document.write(a[0]); document.write(a[1]); document.write(a[2]); しかし、javascriptはその辺り空気を読んで、aの配列の中身を「document.write(a);」この表記だけで全て出力してくれます。 その際のフォーマットがa[0]a[1]a[2]の各変数の値の間にカンマを入れる形だというだけのことです。 サンプルで/*here*/が2だと次のようになります。 ※oの要素数が3つなので3回ループが回ります。 --- var o = {x:1, y:2, z:3}; var a = [], i = 0; for(a[2] in o) document.write(a); --- ループ1 a[0]="",a[1]="",a[2]="x" なので ,,xを出力 画面上も「,,x」 ループ2 a[0]="",a[1]="",a[2]="y" なので ,,yを出力 画面上は「,,x,,y」 ループ3 a[0]="",a[1]="",a[2]="z" なので ,,zを出力 画面上は「,,x,,y,,z」 ※配列は連番で変数が存在しいきなりa[2]が存在することはできません。 ※定義時はa=[]で所属変数はありません。 ※その後突然a[2]が作成され値が代入されたので、自動的にa[0],a[1]が作成されます。 ※勝手に作成されたa[0]a[1]の中身は空です。 ※これもjavascriptが気を利かせて勝手にやっていることで、他の言語ではこのような気ままコードを書くとエラーになる物もあります。
退会済みユーザー

退会済みユーザー

2015/11/03 22:50

すごい分かりやすい回答ありがとうございます!!! しかしながらまだ疑問があります a[1]の場合 ループ1 a[0]="", a[1]="x" 出力="/*空*/,x" ループ2 a[0]="", a[1]="y" 出力="/*空*/,y" ループ3 a[0]="", a[1]="z" 出力="/*空*/,z" a[i++]の場合 ループ1(i++ = 0) a[0]=x 出力="x" ループ2(i++ = 1) a[0]=x a[1]="y" 出力="x,y" ループ3(i++ = 2) a[0]=x a[1]="y" a[2]="z" 出力="x,y,z" ですよね?この時当コードの/*here*/に1を直接入れた場合のループ2は a[0]="", a[1]="y" 出力="/*空*/,y" なのにi++の値が1になる(ループ2)場合は a[0]=x a[1]="y" 出力="x,y" とxも出力されるのはなぜですか?
hirohiro

2015/11/04 00:40

?ちょっとよく分かりませんが、 /*here*/が1のループ2終了時点は a[0]="" a[1]="y" /*here*/がi++のループ2終了時点は a[0]="x" a[1]="y" 両方document.write(a)で「a[0],a[1]」の値が展開されたものが出力されるわけですが、前者は「,y」後者は「x,y」になりませんか?
退会済みユーザー

退会済みユーザー

2015/11/04 00:53

そうです! 形は違いますがa[1]とループ2のa[i++]は同じですよね? ではなぜ出力が変わるのでしょうか?
hirohiro

2015/11/04 01:04

というか配列を知ろうとするのに、例の「for(a[/*here*/] in o) document.write(a);」このコードは全く良くないです。一種のパズルのようなものなので、自在にjavascriptが書けるようになってから改めて見たほうが良いと思います。多分混乱を広げているだけです。 配列の添え字がどういう動きか知りたいなら次のようなコードのほうが良いのではないかと ----- var a=["x","y","z"]; document.write("配列の一番目は " + a[0] + "<br/>"); document.write("配列の二番目は " + a[1] + "<br/>"); document.write("配列の三番目は " + a[2] + "<br/>"); document.write("<br/>forループでアクセス<br/>"); for(var i=0; i < a.length; i++){ document.write("配列の" + (i+1) + "番目は " + a[i] + "<br/>"); }
hirohiro

2015/11/04 01:08 編集

>>形は違いますがa[1]とループ2のa[i++]は同じですよね? いえ違いますよ? /*here*/が1のループ2終了時点は a[0]="" a[1]="y" /*here*/がi++のループ2終了時点は a[0]="x" a[1]="y" 前者はa[0]が空白です。 なぜならループの1回目も2回目もa[1]に繰り返しoのキーを上書きしてるだけだからです。 翻ってa[i++]のほうは、1回目はa[0]、2回目はa[1]にoのキーを書き込んでいます。
hirohiro

2015/11/04 01:27 編集

>>形は違いますがa[1]とループ2のa[i++]は同じですよね? あっと、a[1]もa[i]も同じ値を参照しますね。 >>ではなぜ出力が変わるのでしょうか? 書き出してるのはa[1]だけでなく、a[0]とa[1]の両方ですよね? document.write(a);このコードで書き出しているので a[0]の値がそれぞれのケースで異なるので、両方書き出したら別々の出力になるのだと思いますが…
hirohiro

2015/11/04 01:26 編集

思ったのですが、for文が何をしているのかも、いまいち分からなかったりしますか? for(条件){処理} この「条件」が真の間、「処理」を繰り返すのがfor文です。 for(a[1] in o) この書き方変わっていて、a[1]にoの要素名を順番に代入するという処理”も”行いますが、ループの条件はoの最後の値まで参照したかどうかです。 つまりoが持っている要素数だけループが回ります。 処理に「document.write(a);」があると、これを毎回実行します。 毎回、その時点でのaの内容を全て出力してるわけです。
退会済みユーザー

退会済みユーザー

2015/11/04 01:32

すいません。混乱してしまったのでもう一度質問させてください var o = {x:1, y:2, z:3}; var a = [], i = 0; for(a[i++] in o) document.write(a); この[]に挟まれた値(i++)はどういう意味を持つのでしょうか 例えば var o =["x","y","z"]; console.log(o[0]);だとしたら出力は"x"ですよね? この添え字を作るための[]とは違う意味合いなのでしょうか?
hirohiro

2015/11/04 01:58 編集

> console.log(o[0]);だとしたら出力は"x"ですよね? そうですね。そして var o =["x","y","z"]; i=0; console.log(o[i]); //出力は"x" i=1; console.log(o[i]); //出力は"y" i=2; console.log(o[i]); //出力は"z" です。 var o =["x","y","z"]; この記述は["x","y","z"] という配列を作成して、その配列の先頭の場所をoに代入しています。イコールの右側に[]を書いた時にそう動きます。 本来 var 0=[]; o[0]="x"; o[1]="y"; o[2]="z"; としなきゃいけないものを短縮して書いているという認識でいいと思います。 >>この[]に挟まれた値(i++)はどういう意味を持つのでしょうか oの配列の何番目の値かを示します。 それとo[i++]という書き方は普段はあまり使いません。本来複数行に渡って書かなきゃいけないものを短縮して書く事ができるというだけのものです。 i++を使ったら上の方で書いたコードはこのように書けます。 var o =["x","y","z"]; i=0; console.log(o[i++]); //出力は"x" console.log(o[i++]); //出力は"y" console.log(o[i++]); //出力は"z"
退会済みユーザー

退会済みユーザー

2015/11/04 02:09

ありがとうございます var o =["x","y","z"];のような配列については理解済みです では var o = {x:1,y:2,z:3}のようなオブジェクトの場合 a[/*here*/]の/*here*/に当たる値はどういう意味を持つのでしょうか
think49

2015/11/04 02:21 編集

別の場所にも書きましたが、a[/*here*/] に for-in 構文上の意味などないのですよ。 代入先の場所として a[i] が存在するだけです。 a = []; なので a[0] や a[i] のような参照が可能でしたが、a = {x: 1}; なら a.x でもいいですし、a = [[]] なら a[0][0] でも機能するはずです。 あえていうなら、配列のインデックス値を指定している事ですね。 var a = [1]; a[0] = ’hoge’; // a[0] に "hoge" を代入
hirohiro

2015/11/04 03:25 編集

var o = {x:1,y:2,z:3} なら、同じ伝でいくならo["x"]やo["y"]でアクセス可能です。 console.log(o["x"]); //1 意味は同じです。o["x"]はkey"x"の示すプロパティ値を参照します。 申し訳ないのですが、疑問点が何処にあるのか分かりません。 例に出されてるfor inのコードは{x:1,y:2,z:3}プロパティの値1,2,3にアクセスするのとは別のことをしているものですよ?
退会済みユーザー

退会済みユーザー

2015/11/04 03:31

var o = {x:1, y:2, z:3}; var a = [], i = 0; for(a[i++] in o)//here document.write(a); では//ではaの配列のi++(添え字として)番目の値にo(オブジェクト)のプロパティ名に置き換えるという意味でしょうか?
hirohiro

2015/11/04 04:14

//ではというのがよく分かりませんが、そうですね。 oのプロパティ名の一覧を配列aに作成しようとしているようです。 もしプロパティ名の一覧を配列aにコピーして、完成したaを確認したいなら目的のコードはこうでしょう var o = {x:1, y:2, z:3}; var a=[], i=0; for(a[i++] in o); console.log(a);
退会済みユーザー

退会済みユーザー

2015/11/04 04:37

ありがとうございます!!!
guest

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

ご回答ありがとうございます すいませんが質問を少し変えさせてください /*here*/に入る数字は何を表していますか? 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と出力されるのでしょうか? 上の方と同じ質問ですが、ご回答お願いします
退会済みユーザー

退会済みユーザー

2015/11/03 17:05 編集

/*here*/は、単純に番号です。 例えば、学校のクラスを思い浮かべてみましょう。 a組0番の伊藤さん、a組1番の鈴木さん、a組2番の大久保さん ↑これが、配列です。 ググれば、どっかに答えありそうですが、 多分としか言えませんが、JavaScriptの仕様かバグなんでしょうね。 ループの1回目は、カンマなし、2回目はカンマ付ける、3回目は2度カンマ付ける。 そもそも、aの配列の中身を確認したいデバッグのとき以外、あまり有用な使い道はなく、そこを深く突っ込むのは、本筋からそれてしまっているような気がします。 for inの中で、配列固定a[1]にすると以下の結果になります。 a組0番は、処理されず空白 a組2番は、処理されず空白 a組1番に、伊藤さん × 3回上書き という答えで分かりますでしょうか? --------------------------------------------- for (変数A in コレクションB){ 変数Aの処理 ~ } ※単純に、コレクションBから一つずつ取り出して変数Aに入れて、 コレクションがなくなるまで繰り返すという処理です。
退会済みユーザー

退会済みユーザー

2015/11/03 23:32 編集

他の方の回答を読んでいて、質問者様が勘違いをされていると思いましたので追記します。 そもそも、for in の中で、a[1]としてしまった場合、a[0]とa[2]は、for inの中で使用されていないのが正解です。 つまり、本来なら、a[0]から始めないといけない、配列変数をa[1]から始めていて、バグを引き起こしているが正解です。 for inの中で、数字を固定にしてはいけません、配列変数なので。 そもそも、a[1]とした時点でバグを生み出しています。 時間がないので、もし分からないとの事でしたら、帰宅後、ロジックを書かせていただきます。
退会済みユーザー

退会済みユーザー

2015/11/04 00:51

そもそもa[i++]の意味が分かりません for(a[i++] in o)ってどういう意味になるのですか?
think49

2015/11/04 01:17 編集

既に何度も編集しているのですが、下記回答欄は見ていていただけているのでしょうか。 tomy_SQAIRさんの疑問に答える形になっていると思うのですが。 https://teratail.com/questions/19270#r30077
退会済みユーザー

退会済みユーザー

2015/11/04 01:49

ロジック云々以前に、プログラムの基礎中の基礎である、データ型や算術演算子を理解された方がよろしいかと思います。 javascriptは、C言語の流れをくんでいると言う事から始まります。 そもそも、 i++ とは、 i=i+1 の事で、省略系の演算子で インクリメント演算子と言います。 マイナスのデクリメント演算子も存在します。 この書き方は、C言語の流れをくむ言語以外では、存在せず、 i=i+1 と、書くしかない言語も多数存在します。
退会済みユーザー

退会済みユーザー

2015/11/04 02:01

i++は分かります ではなく for(a[/*here*/] in o)の/*here*/にあたる値がどう機能するかがわからなのです
guest

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

trick

総合スコア366

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

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

退会済みユーザー

退会済みユーザー

2015/11/03 16:54

もう少しで解決しそうです! もう少し解説お願いします 1回目のループ a[1] = 'x' ここでは、aの要素数は2個、a[0] = ''、a[1] = 'x' a を表示 a[0] ,a[1] を表示するので、'□,x'(□は空です。) とありましたがa=[0]のときからなのでしょうか?
guest

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

trick

総合スコア366

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

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

退会済みユーザー

退会済みユーザー

2015/11/03 13:38

以前は分かりやすい回答ありがとうございました。以前の質問は無事かいけつしたのですが、for(a[0] in o)の意味がわからないのです。 0の場合xyz 1の場合,x,y,z 2の場合,,x,,y,,z となります。i++の場合はループごとに値が変わりますが、 引数が固定だった場合どうなるのでしょうか。
trick

2015/11/03 14:04 編集

すいませんわかりました。 for(a[0] in o) for(a[1] in o) for(a[2] in o) の場合ですね。 この場合、document.write(a); では a の値全てを表示します。 例えば、a[2] の場合は、a は3つの配列になっており a[0],a[1] には値が入っておらず、a[2] には x が入っているため document.write(a); では a[0],a[1],a[2] が表示されて結果 空,空,x と表示されるためです。
退会済みユーザー

退会済みユーザー

2015/11/03 14:05

滑稽な質問で申し訳ないのですが なぜxyzになるのでしょうか?
trick

2015/11/03 14:09

for(a[0] in o) この場合の事ですかね。 この場合は、a は1つの配列です。 a[0] にしか値が入っていません。 その為、document.write(a); では a[0] を表示して終わっています。 1回目のループ  a[0] = x a[0]を表示「x」 2回目のループ  a[0] = y 1回目の表示「x」の後ろに、a[0]を表示「y」 3回目のループ  a[0] = z 1・2回目の表示「xy」の後ろに、a[0]を表示「z」 となります。
退会済みユーザー

退会済みユーザー

2015/11/03 14:16

結局その[]内の数値が変わると何が変わるのでしょうか?
trick

2015/11/03 14:19

[] 内の数値が変わると a の配列の要素数が変わります。 a[1] の場合は 要素数 2 になり a[2] の場合は 要素数 3 になります。 この様な書き方はほぼしないと思います。
退会済みユーザー

退会済みユーザー

2015/11/03 14:27

a[1]の場合 ,x,y,zと出るのですが ループ2週目のi++の値も1ですよね? でも x,yと表示されますよね? そこがいまいちわからないのです...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問