2010-11-25 4 views
1

C'est juste ça. J'ai regardé en ligne et j'ai regardé StackOverflow et je ne vois personne parler de ça.JavaScript Pour ... dans ... renvoie hasObject?

Est-il normal lorsqu'un tableau est construit comme:

_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'; 

que lorsque vous exécutez à travers elle comme ceci:

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

La dernière chose que e est réglé sur est « hasObject » dans mon code. Je devais mettre en place un garde en sécurité dans « enableElement », comme dans ce cas e renvoie null comme « hasObject » devient une fonction:

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

Je suis en cela sur le dernier Safari. Oui, je sais que je pourrais utiliser toutes sortes de navigateurs alternatifs qui peuvent faire toutes sortes de trucs whizbang, mais Safari est ce que j'utilise pour ce projet.

Est-ce un comportement normal du navigateur? Pourquoi cela pourrait-il arriver?

+0

Ah oui, je dois utiliser la boucle traditionnelle. Merci de me corriger et de me mettre sur la bonne voie.A appris quelque chose aujourd'hui :-) – Asher

+1

Juste fini de taper un court roman sur ce http://stackoverflow.com/questions/4261051/javascript-why-for-in-is-a-bad-practice/4273208#4273208 ne me fais pas écrire un autre! :-) BTW, '_e = ['admin_adv_from_date_month', 'admin_adv_from_date_day', 'ainsi de suite']' –

Répondre

4

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

for...in

"une variable spécifiée Itère sur toutes les propriétés d'un objet, dans un ordre quelconque. Pour chaque propriété distincte, l'instruction spécifiée est exécutée."

"Bien qu'il puisse être tentant de l'utiliser comme un moyen d'itérer sur un tableau, c'est une mauvaise idée."

Vous ne devez pas utiliser for...in pour effectuer des itérations sur des tableaux, mais plutôt pour parcourir des propriétés d'objet. Utilisez une bonne vieille boucle for (var i = 0; i < arr.length; i++) à la place.

2

Vous ne devez pas utiliser for in pour effectuer une boucle dans un tableau.
Utilisez à la place une boucle for normale avec un index.

Pour répondre à la question, for in énumérera également toutes les méthodes héritées des prototypes.

2

règle simple: ne pas utiliser for...in-itérer un tableau, vous êtes le tableau énumérant, et toutes les propriétés supplémentaires qu'elle peut avoir. Vous devez utiliser une boucle for normale ici, comme ceci:

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

utilisation .length, non for..in pour les tableaux.

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

Sinon, vous risquez par quoi que ce soit étendu énumération par Object.prototype. Vous pouvez .hasOwnProperty vérifier mais pourquoi le faire quand .length est parfait?

Questions connexes