0

この問題を正確に表現する方法はわかりませんが、これは非常に複雑であることがわかりました。

基本的に、このテストは chrome の開発者ツール コンソールで行いました。

for (var request in [0,1,2]) { console.log(request);}

0
1
2
compare 

最後の 4 行はすべて for ループからの出力です。forループ中に、リクエストは値比較を取得しました。

これはクロムのバグなのだろうか。

4

4 に答える 4

2

for ... in ...オブジェクトの列挙可能なプロパティを反復処理し、配列インデックス用ではありません。配列インデックスも列挙可能なプロパティですが、安全でないものを追加したものも返されることがわかりましたArray.prototype

ES5 ブラウザーに (列挙不可能な) メソッドを安全に追加するには、次のようにArray.prototype使用できますObject.defineProperty

Object.defineProperty(Array.prototype, 'compare', {
    value: function() {
        ...
    }
});

これfor ... inで壊れることはなくなりますが、対象の変数が配列である場合、ジョブにとってはまだ不適切なツールです。

于 2013-10-05T23:13:38.063 に答える
1

インデックス付き for ループを使用するのが最善です。For..in は、継承されたプロパティなども列挙します。

var request = [0,1,2];
for (var i = 0; i < request.length; i++) {
   console.log(request[i]);
}

この質問に対する一番の答え:

スタックオーバーフローの以前の回答

私ができるよりもうまく言えます:

于 2013-10-05T23:16:52.143 に答える
0

他の人が指摘したfor .. inように、配列を反復処理する最良の方法ではありません。何らかの理由でそれを使用することを主張する場合 - hasOwnPropertyメソッドを使用して、プロパティが実際に配列に属していることを確認します。

var arr = [0,1,2];

for (var request in arr ) { 
    if (arr.hasOwnProperty(request)) console.log(request);
}
于 2013-10-05T23:35:47.787 に答える