0
var yourObjects = [ 

{ object: {obj1:"aa"}, direction: 'top' },
{ object: "obj2", direction: 'left' }, 
{ object: "obj3", direction: 'bottom' }

]; 

for (var i in yourObjects) { alert(i); }

それについては長い議論がありました。オブジェクトを反復処理するために使用for inすると、オブジェクトのすべてのプロパティとメソッドが返されるため、通常は.hasOwnProperty()メソッドを使用する必要があります。しかし、配列を反復するとき、実際for inには配列のインデックス(または連想配列の場合はキー)を反復します。私は持っているすべてのブラウザでそれを試しました。しかし、jsfiddleで試してみると...同じではありませんでした...配列が持つすべてのメソッドを返しました。

だから私の質問は:for in配列を反復するために使用するのは安全ですか?

ブラウザとjsfiddleでこのコードを試して、どう思いますか。

4

1 に答える 1

7

for-inアレイで使用しない理由は複数あります。

JavaScriptでは、配列は単なるオブジェクトの一種であるためfor-in、配列で行うことfor-inはプレーンオブジェクトで行うことと同じです。

jsFiddleでは、おそらく左側で拡張されたライブラリが選択されていましたArray.prototype。これは、これらのメソッドが由来する場所です。

しかし、別の理由があります。Afor-inは、プロパティが列挙される順序を保証するものではありません。制約がないため、インデックスが順不同で列挙され、ECMAScriptに完全に準拠している可能性があります。

for-inまた、 DOM要素に加えて列挙できるデフォルトのプロパティが含まれているため使用してはならないNodeListsのような配列のようなコレクションがあります。

単純な事実は、JavaScriptでは、for-inインデックスベースの列挙には適切なツールではないということです。


オブジェクトに関してはhasOwnProperty、特定の必要がある場合にのみ使用する必要があります。

一部の人々は、それがすべてのオブジェクトで使用されなければならないと提案します。それは非常に妄想的な考え方です。その方法は、それが理にかなっている狭い状況で使用されるべきガードです。

優れたプログラミング手法に準拠している限り、ほとんどの場合、これを使用しても意味がありません。これには、に列挙可能なプロパティを配置しないことが含まれObject.prototypeます。プログラミング環境を作るのは、単純で合理的な要件です。

それ.prototype理にかなっているのは、列挙可能なプロパティで拡張されたカスタムコンストラクターから作成されたオブジェクトを列挙しているときです。その場合、それは使用するのに適切なガードです。

より合理的なアプローチが環境を変更しない単純な要件を持つことである場合、プレーンオブジェクトでそれを使用することは大規模なやり過ぎですObject.prototype

于 2012-09-26T04:02:55.097 に答える