for..in
配列反復には使用しないでください。
[]
インデックスにアクセスするための Javascript 配列の角括弧構文 ( ) は、実際にはObject
...から継承されていることを理解することが重要です。
obj.prop === obj['prop'] // true
この構造は、他の言語 (php、python など) に見られるfor..in
より伝統的な構造とは異なります。for..each/in
Javascriptは、オブジェクトfor..in
のプロパティを反復処理するように設計されています。各プロパティのキーを生成します。このキーを 's ブラケット構文と組み合わせて使用すると、目的の値に簡単にアクセスできます。Object
var obj = {
foo: "bar",
fizz: "buzz",
moo: "muck"
};
for ( var prop in obj ) {
console.log(prop); // foo / fizz / moo
console.log(obj[prop]); // bar / buzz / muck
}
また、Array は、連続する数値プロパティ名 (インデックス)を持つ単なるオブジェクトであるため、同様の方法でfor..in
機能し、上記のプロパティ名を生成するのと同じように数値インデックスを生成します。
構造体の重要な特徴はfor..in
、プロトタイプ チェーンを上って列挙可能なプロパティを検索し続けることです。また、継承された列挙可能なプロパティを反復します。現在のプロパティがローカル オブジェクトに直接存在し、それが関連付けられているプロトタイプに存在しないことを確認するのはあなた次第ですhasOwnProperty()
...
for ( var prop in obj ) {
if ( obj.hasOwnProperty(prop) ) {
// prop is actually obj's property (not inherited)
}
}
(プロトタイプ継承の詳細)
Array 型で構造体を使用する際の問題はfor..in
、プロパティが生成される順序について保証がないことです...そして一般的に言えば、それは配列を処理する上で非常に重要な機能です。
もう 1 つの問題は、通常、標準の実装よりも遅いことです。for
結論
配列を反復処理するためにa を使用するfor...in
ことは、ドライバーのバットを使用して釘を打ち込むようなものです...ハンマー ( for
) を使用しないのはなぜですか?