ここでの正解は、for(...in...)
ループを使用して Javascript で配列を反復するべきではないということです。
配列を持つことの要点は、要素の番号付きシーケンスがあるため、for()
ループを使用する必要があることです。
for(var i=0; i<myArray.length; i++) {
//do stuff here with myArray[i]
}
この場合、それだけで問題は解決します。これは、番号付きの要素のみを反復するため、indexOf
メソッドは関与しません。
ただし、ここで問題を簡単にfor(..in..)
説明すると役立つ場合があるので、説明させてください...
表示されているエラーの根本的な原因は、indexOf
メソッドが IE8 の配列に対してサポートされていないためです。そのため、コード内の何か (jQuery ではありません) がそれを Array プロトタイプに追加しています。
これは、for(..in..)
ループを実行すると、反復される要素の 1 つとして選択されることを意味します。
この場合、より良い解決策 (for()
ループ。上記を参照) がありますが、実際にループを使用する必要がある場合for(..in..)
、これは実際の問題になる可能性があります。ループhasOwnProperty()
内をすぐにチェックすることで、これを防ぐことができます。for(..in..)
この関数は、オブジェクト プロトタイプの一部である項目を返すfalse
ため、オブジェクトをループするときに不要なメソッドにヒットするのを避けるのに役立ちます。
for(..in..)
これは、すべてのループのベスト プラクティスと見なされます。実際、コーディング スタイルをチェックするためにJSLintなどのツールを使用すると、これを行わないとエラーが発生します。