6

IE8でいくつかのJavaScrptコードをテストしているときに、単純なfor..inループを実行すると奇妙な動作が発生します。

var categories = ['for', 'bar', 'steam'];
for(var key in categories) {
    console.log(key);
}

出力:

0
1
2
forEach
map
filter
reduce
indexOf
end

配列のプロトタイプ関数はどれに含まれていますか?それは間違いなくそれが機能するはずの方法ではありません。何故ですか?

ところで、ループをに変更するときはもちろん機能しますfor (var key=0; key < categories.length, key++)

4

3 に答える 3

2

for..in配列ではなくオブジェクトを対象としています。通常のforループを使用します。

for (var i = 0; i < categories.length; i++) {
  console.log(categories[i]);
}

for...inインデックスを気にしない場合は配列で機能しますが、お勧めできません。発生している問題は、プロトタイプのプロパティを含むオブジェクトのすべてfor...inのプロパティを検索するためです。そのため、プロパティが実際にオブジェクトにあるかどうかを常に確認することをお勧めします。

for (var i in obj) {
    if (obj.hasOwnProperty(i)) {
        // do something
    }
}
于 2012-10-26T07:18:07.673 に答える
2

これは、おそらくを拡張するライブラリを使用しているためですArray.prototype。他のブラウザで発生しない理由は、それらのブラウザがすでにそれらのメソッドをネイティブにサポートしているためです。IEはこれをサポートしていないため、JSに追加するコードがいくつかあり、メソッドを列挙可能にします。

for inこれが、配列で使用すべきでない理由の1つです。

for inもう1つは、反復の順序を保証しないという事実です。ほとんどのブラウザーで機能しますが、仕様では未定義の動作として明示的に残されています。John Resig自身がchromehttp://code.google.com/p/chromium/issues/detail?id=883に対してバグを報告しましたがプロパティを注文する必要がないため、修正されないためクローズされました。

標準ループの使用に固執する

于 2012-10-26T07:21:11.903 に答える
0

何らかのフレームワークを使用しているようです。一部のフレームワークは標準のプロトタイプに機能を追加するため、配列を反復するのは悪い方法です。

 for (var i=0, len=arr.length; i<len; ++i) {

 }

そのコードはどこでも機能します。

于 2012-10-26T07:20:46.067 に答える