Javascript では、ループでインデックスとして使用される変数は、次のように定義してもfor..in
常に a になることに気付きました。string
var s_array = new Array();
s_array[0] = 'foo';
s_array[1] = 'bar';
for(i in s_array){
alert(typeof(i)); // String
}
string
ではなくと見なされるのはなぜnumber
ですか?
Javascript では、ループでインデックスとして使用される変数は、次のように定義してもfor..in
常に a になることに気付きました。string
var s_array = new Array();
s_array[0] = 'foo';
s_array[1] = 'bar';
for(i in s_array){
alert(typeof(i)); // String
}
string
ではなくと見なされるのはなぜnumber
ですか?
この構文は、(配列のインデックスではなくfor(x in y)
)オブジェクトのプロパティを反復処理することを目的としており、プロパティ名は常に文字列として格納されます。
配列に対しても機能するという事実は、配列要素が配列オブジェクトのプロパティであることの副作用です。
違いを理解するには、次のコードを検討してください。
var s_array = new Array();
s_array[0] = 'foo';
s_array[1] = 'bar';
s_array['foo'] = 'bar';
console.log("Object:");
for(i in s_array) {
console.log(i);
}
console.log("Array:");
for(var i = 0, l = s_array.length; i < l; i++) {
console.log(i);
}
次の出力が提供されます。
Object:
0
1
foo
Array:
0
1
オブジェクトにはfoo
プロパティがありますが、実際には配列内の要素ではありません。
js 配列は、高レベルのリストのようなオブジェクト (連想配列) です。
とにかく、暗黙的な toString 変換を通じて、インデックスは最終的に JavaScript エンジンによって強制的に文字列に変換されます。
ソース: MDN
配列は基本的に、管理された一連のインデックス付きキーを持つオブジェクトです。
オブジェクトのすべてのキーは文字列型であるため、これも文字列です。
あなたの配列を次のように考えてください:
{"0" : "foo" , "1" : "bar"}
だからあなたの
for(i in s_array){ alert(typeof(i)); }
として読むことができます
s_array の各キーに対して