miu_ras さんの仰る通りなのですが、いくつか補足しておきます。
グローバル変数はグローバルオブジェクト(window
)のプロパティでもある為、グローバル変数 name
は window.name
と衝突します。
window.name
は String 型のプロパティとして定義されている為、String 型に強制的に変換されます。
String 型は ES5 から配列のように参照可能になっており、string[0]
は string.charAt(0)
と同じ値を返します。
従って、グローバル変数 name
は String 型に変換され、for-in
で1文字ずつ値を返すようになってしまいます。
解決法としては関数内で変数を定義して下さい。
変数名を変更することでも回避可能ですが、window
のプロパティは新しい仕様が生まれる度に増えていく運命にあります。
仕様が増える度に変数名が衝突する懸念があるのでローカル変数として定義した方が安全度が高いと思われます。
OKWave で同様の回答をした事がある為、そちらも参考にどうぞ。
for-in
はプロトタイプ上のプロパティも拾う上、列挙順がランダムであるという性質があります。
配列の繰り返し文は一般に 0 から順番にインクリメントして走査することを期待する為、for-in
での走査は推奨されません。
配列の繰り返しには for
文もしくは Array.protoype.forEach
を使用して下さい。
解決の為のコード例を載せておきます。
始めは難しく考えず、for
文を使うことをお勧めします。
JavaScript
1(function () { // window.name との衝突を避ける為、関数式で括る (いわゆる即時関数)
2 var name = ['山田', '佐藤', '鈴木']; // ローカル変数を定義
3
4 for (var i = 0, l = name.length; i < l; ++i) {
5 document.write(name[i] + 'です。' + '<br>');
6 }
7
8 name.forEach(function (value) { // Array.protoype.forEach
9 document.write(value + 'です。' + '<br>');
10 });
11
12 document.write(name.map(function (value) { // Array.protoype.map, Array.protoype.join
13 return value + 'です。';
14 }).join('<br>'));
15}());
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/09/23 12:04