この問題を正確に表現する方法はわかりませんが、これは非常に複雑であることがわかりました。
基本的に、このテストは chrome の開発者ツール コンソールで行いました。
for (var request in [0,1,2]) { console.log(request);}
0
1
2
compare
最後の 4 行はすべて for ループからの出力です。forループ中に、リクエストは値比較を取得しました。
これはクロムのバグなのだろうか。
この問題を正確に表現する方法はわかりませんが、これは非常に複雑であることがわかりました。
基本的に、このテストは chrome の開発者ツール コンソールで行いました。
for (var request in [0,1,2]) { console.log(request);}
0
1
2
compare
最後の 4 行はすべて for ループからの出力です。forループ中に、リクエストは値比較を取得しました。
これはクロムのバグなのだろうか。
for ... in ...
オブジェクトの列挙可能なプロパティを反復処理し、配列インデックス用ではありません。配列インデックスも列挙可能なプロパティですが、安全でないものを追加したものも返されることがわかりましたArray.prototype
。
ES5 ブラウザーに (列挙不可能な) メソッドを安全に追加するには、次のようにArray.prototype
使用できますObject.defineProperty
。
Object.defineProperty(Array.prototype, 'compare', {
value: function() {
...
}
});
これfor ... in
で壊れることはなくなりますが、対象の変数が配列である場合、ジョブにとってはまだ不適切なツールです。
インデックス付き for ループを使用するのが最善です。For..in は、継承されたプロパティなども列挙します。
var request = [0,1,2];
for (var i = 0; i < request.length; i++) {
console.log(request[i]);
}
この質問に対する一番の答え:
私ができるよりもうまく言えます:
他の人が指摘したfor .. in
ように、配列を反復処理する最良の方法ではありません。何らかの理由でそれを使用することを主張する場合 - hasOwnPropertyメソッドを使用して、プロパティが実際に配列に属していることを確認します。
var arr = [0,1,2];
for (var request in arr ) {
if (arr.hasOwnProperty(request)) console.log(request);
}