2012-07-16 12 views
6

アレイ上のfor-in-loopsabsolutely evilです。それでも、それらは頻繁に使用され、引き起こされたエラーはトレースダウンするのが複雑です。特に、ブラウザに依存する場合は、たとえばindexOf-shimsなどが原因です。for-inループ検出スニペットは不要な誤検出を生成しますか?

Object.defineProperty(Array.prototype, "error", { 
    enumerable: true, 
    get: function() { 
     if (this === Array.prototype) // that looks OK 
      return undefined; 
     if (window.confirm("Somebody who coded the site you're viewing runs through an Array with a for-in-loop.\nShame on him!\n\nDo you want to raise an Error to trace the origin?")) 
      throw new SyntaxError("Array traverse with for-in-loop, touching Array.prototype's 'error' property :-)"); 
    } 
}); 

は、あなたがのためのグリースモンキースクリプトとして追加することができます

だから、私はArray.prototype(製品コードでの使用のためではない)に「error」プロパティの列挙ゲッターを追加して、この単純なスニペットをコード化していますほぼすべてのサイトでアラートが表示されます:-)それらのほとんどは、疑問のある引数を持つjQuery.extendへの呼び出しによって引き起こされます。

私の質問は以下のようになります。合法的な「間違った」は、または他の偽陽性アラートを引き起こし何かをループすることをどのような状況はありますか?

これが私のコードの有用性にどう影響するのだろうかと思います。

+0

あなたの質問を編集して、それほど主観的ではないようにしました。あなたが気にしないことを願っています。 – hugomg

+0

ありがとう、私はそのバージョンが好きです - 私はタイトルとして何を使うべきかわからなかった:-) – Bergi

+0

私はそれを取得しません、どのようにこれを 'Array.prototype'に拡張しますか? '__lookupGetter__'や何かを使う必要があります。これで、単純にエラーが発生します。これは、extend関数がそれを取得し、エラーがスローされ、コピーを停止するためです。 http://jsfiddle.net/MvgJC/ – Esailija

答えて

0

はい。私は反復処理したい場合は

var a = []; 
a[123123] = "foo"; 
a[1233123] = "bar"; 

:正統性は、多くの場合、おそらく私はデータのみをインデックスに値を設定したスパース配列を、持っている、一例として

主観的な、しかし...することができこの配列で定義した要素は、for...in構造体を使用します。私は守備それをコード化された場合でも、あなたのスクリプトはまだ

for (var prop in a) { 
    if (a.hasOwnProperty(prop)) { 
    // this is a legitimate array element 
    } 
} 

は、より多くの情報や意見のためにもWhy is using "for...in" with array iteration a bad idea?見る(偽陽性)をトリガします。

+2

いいえ、防御的にコーディングされたループ(これは問題ありません) '' '' error "'であるので、例外は発生しません。 – Bergi

関連する問題