2

に便利なヘルパーをいくつか追加しましたArraytoSource()Operaなど)。そしてfor..in、通常のプロパティを持つ関数を返します。

for..inコードが読みやすいので、今使っています。そしてそれはjsのネイティブ機能なので、もっと速くなければなりません。

ただし、ループに型チェックを追加すると、classicを使いやすくなりますfor(;;)

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

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

ありがとうございました。


編集:オブジェクトから関数やカスタムプロパティを列挙する
ことを回避する機能はありますか?for..in

4

6 に答える 6

5

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

詳細については、prototype.jsライブラリでそれについて読んでください。

于 2009-11-27T16:03:15.730 に答える
3

はい。ただし、JavaScript1.7以降のみです。OperaではJavaScript1.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];
    }
};
于 2009-11-27T17:29:03.827 に答える
2

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

Object.defineProperty( Array.prototype, "myNewMethod", {
   value: function(){},
   writable: true,
   enumerable: false, /* this controls for..in visibility */
   configurable: true
});
于 2012-01-03T23:35:21.333 に答える
2

他の人が述べたように、配列を反復処理するために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))
  {
    ...
  }
}
于 2009-11-27T16:34:45.077 に答える
1

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

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

それ以外の:

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

彼らは違うからです。

2番目のフォームで取得するすべてのメンバーを必要とせず、インデックス付きの要素だけが必要な場合は、最初のフォームを使用します。

于 2009-11-27T16:02:57.263 に答える
0

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

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

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

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

于 2009-12-06T20:09:40.937 に答える