配列に追加されたメソッドを「for..in」ループの処理から除外するにはどうすればよいですか?(JavaScript)

StackOverflow https://stackoverflow.com/questions/1809505

  •  05-07-2019
  •  | 
  •  

質問

いくつかの便利なヘルパーを追加しました Array (のような toSource() オペラ用)。そしていま for..in 通常のプロパティを持つ関数を返します。

使っています for..in コードが読みやすくなりました。これは js のネイティブ関数であるため、より高速である必要があります。

ただし、ループ内に型チェックを追加すると、クラシックなコードを使いやすくなります。 for(;;).

回避する方法はありますか for..in 関数を列挙しますか?

クロスブラウザーでの作業はあまり必要ありません (Opera で動作する必要があります) が、速度は重要です。

ありがとう。


編集:
回避能力はあるのか for..in 任意のオブジェクトから関数またはカスタム プロパティを列挙しますか?

役に立ちましたか?

解決

for..inループを使用して配列要素を反復処理しないでください。 for..inは、プロパティを反復処理するように設計されており、今説明したとおりの理由で、そのためにのみ使用する必要があります。多くのライブラリは、配列、日付などのプロトタイプを変更するため、配列要素だけを繰り返し処理することに頼るべきではありません。 for(;;)メソッドを使用すると、必要な処理が保証されます。また、java.scriptにもネイティブなので、for..inループよりも高速ではありません。

詳細については、 prototype.js ライブラリをご覧ください。

他のヒント

はい、ただしJavaScript 1.7+のみです。 OperaはJavaScript 1.7のサポートを制限しています。これには割り当ての破壊の非常に基本的なサポートが含まれているため、Operaでは機能しませんが、Firefoxでは機能します。

この実装により、 for [each](item in array)

を安全に使用できます。
Array.prototype.__iterator__ = function (flag) {
    var len = this.length, i = 0;

    for (; i < len; i++) {
        yield flag ? i : this[i];
    }
};

他の人が述べたように、for..inを使用して配列を繰り返すべきではありません。 for(;;)を使用するよりも時間がかかります。

パフォーマンスに懸念がある場合は、配列の長さもキャッシュする必要があります。

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

for..inのみを使用して、オブジェクトのプロパティを反復処理します。継承されたプロパティを除外するには、hasOwnProperty()メソッドを使用します。

for (var prop in object)
{
  // Don't include properties inherited from the prototype chain
  if (object.hasOwnProperty(prop))
  {
    ...
  }
}

ES5をサポートする別のオプションがあり、列挙不可能なプロパティを定義できます! (テストしていませんが)次のようなことができるはずです:

Object.defineProperty( Array.prototype, "myNewMethod", {
   value: function(){},
   writable: true,
   enumerable: false, /* this controls for..in visibility */
   configurable: true
});

あなたが説明していることは、まさにあなたが使用する理由です

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

の代わりに:

for (var item in arr) { ... }

それらは違うからです。

2 番目の形式で取得するすべてのメンバーではなく、インデックス付き要素のみが必要な場合は、最初の形式を使用します。

編集:@Bergiのコメントのおかげで間違ったタイプの使用法を修正しました

(非常に)疎な配列を反復処理するときのパフォーマンスに関する良い点-おそらくループでisNaN(parseInt())を使用すると、配列要素のみを検索できることをお勧めします:

for( var propertyName in myArray){
    if( !isNaN(parseInt(propertyName)) ){ /* probably array element */ }
}

hasOwnProperty()と上記のアプローチのパフォーマンスがよくわからないが。これは、非常に大きな配列を10000回繰り返して測定する必要があります。何らかのパフォーマンス測定を行う場合、結果は興味深いものになるので、共有してください! :)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top