7

配列での for-in-loops絶対に悪であることは誰もが知っています。それでも、それらは頻繁に使用され、原因となったエラーを追跡するのは複雑です。特に、たとえばindexOf-shim などが原因でブラウザーに依存する場合はそうです。

そこで、" error" プロパティの列挙可能な getter を追加するこの単純なスニペットをコーディングしましたArray.prototype(プロダクション コードでは使用しません)。

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 :-)");
    }
});

すべてのドメインに対してグリースモンキー スクリプトとして追加でき、ほぼすべてのサイトでアラートが表示されます :-) それらのほとんどはjQuery.extend、疑わしい引数を使用した の呼び出しによって引き起こされます。

私の質問は次のとおりです。そのような「間違った」ループを正当化する状況、または誤検知アラートを引き起こすその他の状況はありますか?

これが私のコードの有用性にどのように影響するか疑問に思っています。

4

1 に答える 1

-1

はい。正当性はしばしば主観的なものになる可能性がありますが...

例として、データを含むインデックスに値を設定しただけのスパース配列があるとします。

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
  }
}

配列反復で「for...in」を使用するのはなぜ悪い考えなのですか?も参照してください。詳細と意見については。

于 2012-08-02T17:57:05.173 に答える