2010-11-25 5 views
1

それだけです。私はオンラインで見て、私はStackOverflowを見てきました。私はこれについて話している人はいません。JavaScript for ... in ... hasObjectを返しますか?

_e = Array(); 
_e[0] = 'admin_adv_from_date_month'; 
_e[1] = 'admin_adv_from_date_day'; 
_e[2] = 'admin_adv_from_date_year'; 
_e[3] = 'admin_adv_to_date_month'; 
_e[4] = 'admin_adv_to_date_day'; 
_e[5] = 'admin_adv_to_date_year'; 

あなたがそうのようにそれを介して実行すると、その:配列は、このように構成されている場合

それは正常です

enableElements : function(elements) 
{ 
     for (var e in elements) 
     { 
      hForm.enableElement(elements[e]); 
     } 
} 

eがに設定されている最後の事はで「hasObject」です私のコード。

enableElement : function(element) 
    { 
     var e = document.getElementById(element); 
     if (e) 
     { 
      e.disabled = false; 
     } 
    } 

私は、最新のSafariでこれを実行している:私は「hasObject」の関数となるこの場合のeはnullを返しとして、「enableElement」内の安全ガードを実装する必要がありました。はい、私はあらゆる種類のwhizbangのことをすることのできるあらゆる種類のブラウザを使用していますが、このプロジェクトではSafariを使用しています。

これは通常のブラウザの動作ですか?なぜこれが起こるのでしょうか?

+0

はい、私は従来のforループを使用する必要があります。みんなを訂正し、正しい軌道に乗せてくれてありがとう。今日何かを学びました:-) – Asher

+1

ちょっとした小説を書き終えましたhttp://stackoverflow.com/questions/4261051/javascript-why-for-in-is-a-bad-practice/4273208#4273208別の! :-)ところで、 '_e = ['admin_adv_from_date_month'、 'admin_adv_from_date_day'、 'so on']' –

答えて

4

https://developer.mozilla.org/en/JavaScript/Reference/Statements/for...in

for...in

"反復し、任意の順序ですべてのプロパティオブジェクトの、上に指定された変数は、各個別のプロパティについて、指定された文が実行されます。"

"これをArrayを反復処理する方法として使用するのは魅力的かもしれませんが、これは悪い考えです。"

for...inを使用して配列全体を反復処理する必要はありません。これはオブジェクトプロパティを反復処理するためのものです。代わりに良い古いfor (var i = 0; i < arr.length; i++)ループを使用してください。

2

for inを使用して配列をループしないでください。
代わりに、インデックス付きの通常のforループを使用してください。

質問に答えるために、for inはプロトタイプから継承したすべてのメソッドも列挙します。

2

単純なルール:for...in配列反復には使用しないでください、あなたはは、配列を列挙している、そしてそれが持っている可能性のあるすべての余分な性質。

enableElements : function(elements) 
{ 
    for (var i=0; i<elements.length; i++) 
    { 
     hForm.enableElement(elements[i]); 
    } 
} 
0

アレイ用for..in.lengthを使用していない:あなたはこのように、ここでは通常のforループを使用する必要があります。

enableElements : function(elements) { 
    for (var i=0, l = elements.length; i<l; i++) 
    { 
     hForm.enableElement(elements[i]); 
    } 

そうしないと、Object.prototypeまで拡張されたものが列挙される危険性があります。あなたは.hasOwnPropertyをチェックできますが、なぜ.lengthが完璧なのですか?

関連する問題