配列に追加されたメソッドを「for..in」ループの処理から除外するにはどうすればよいですか?(JavaScript)
-
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回繰り返して測定する必要があります。何らかのパフォーマンス測定を行う場合、結果は興味深いものになるので、共有してください! :)