2010-05-29 27 views
5

J'utilise Google Chrome pour ce test: Contrairement à l'intuition, la première boucle alerte "chaîne" 3 fois, tandis que la seconde boucle alerte "numéro" 3 fois.Lors de l'itération de valeurs, pourquoi typeof (value) renvoie-t-il "string" quand value est un nombre? Javascript

numarray = [1, 2, 3]; 

//for-each loop 
for(num in numarray) 
    alert(typeof(num)); 

//standard loop 
for(i=0; i<numarray.length; i++) 
    alert(typeof(numarray[i])); 

Je m'attendais à ce que les deux boucles alertent le "numéro" 3 fois. Comment la première boucle est-elle implémentée en Javascript? En d'autres termes, si le pour-chacun est du sucre syntaxique, quel est son équivalent en utilisant une boucle standard?

De même, existe-t-il un moyen d'itérer sur l'espace de nom d'un objet en utilisant une boucle standard? Je cherche à toucher chacune des méthodes et attributs d'un objet en utilisant une boucle du second type. Je suis nouveau sur Javascript et toute aide est très appréciée, merci.

+0

Il alerte également 'chaîne' dans IE. – Senthil

+0

duplication possible de [L'index de tableau JavaScript est-il une chaîne ou un nombre entier?] (Http://stackoverflow.com/q/27537677/1048572) – Bergi

Répondre

6

La raison pour laquelle vous voyez « string » retourné dans votre première boucle est que num fait référence à l'index du tableau , pas la valeur de numarray à cet indice. Essayez de changer votre première boucle pour alerter num au lieu de typeof num et vous verrez qu'il crache 0, 1 et 2, qui sont les indices et non les valeurs de votre tableau. Lorsque vous utilisez une boucle for in, vous itérez sur les propriétés d'un objet, ce qui n'est pas exactement équivalent à la boucle for dans votre deuxième exemple. Les tableaux en JavaScript ne sont en réalité que des objets avec des numéros séquentiels en tant que noms de propriétés. Ils sont traités comme des chaînes dans la mesure où typeof est concerné.

Edit:

Comme Matthieu souligne, vous n'êtes pas sûr d'obtenir les éléments du tableau dans un ordre particulier lors de l'utilisation d'une boucle for in, et en partie pour cette raison, il est recommandé de ne pas itérer à travers les tableaux de cette façon.

filip-fku demande quand il serait utile d'utiliser for in, étant donné ce comportement. Un exemple est lorsque les noms de propriétés ont une signification, ce qui n'est pas vraiment le cas avec les indices de tableau. Par exemple:

var myName = { 
    first: 'Jimmy', 
    last: 'Cuadra' 
}; 

for (var prop in myName) { 
    console.log(prop + ': ' + myName[prop]); 
} 

// prints: 
// first: Jimmy 
// last: Cuadra 

Il est également intéressant de noter que les boucles for in également itérer propriétés de la chaîne de prototype de l'objet. Pour cette raison, cela est généralement comment vous voulez construire une boucle for in:

for (var prop in obj) { 
    if (obj.hasOwnProperty(prop)) { 
    // do something 
    } 
} 

Cela fait un chèque pour voir si la propriété a été définie par l'objet lui-même et non un objet, il est héritant de par le prototype chaîne.

+2

Il n'y a aucune garantie que les éléments du tableau seront visités dans l'ordre. Voir [pour ... dans] (https://developer.mozilla.org/fr/core_javascript_1.5_reference/Statements/for...in) à MDC: "itérer sur un tableau ne peut pas visiter les éléments dans l'ordre numérique". C'est la principale raison de ... n'est généralement pas recommandé pour les tableaux. –

+0

+1 @Jimmy: Merci pour l'explication. – Senthil

+0

Intéressant! Différent de ce que l'on pourrait attendre de C#/Java .. Mais comment est-ce mieux que d'écrire explicitement la norme pour la boucle, quand tout ce que vous obtenez sont les indices au lieu des valeurs de tableau eux-mêmes? C'est à dire. Pourquoi voudriez-vous l'utiliser quand tout ce que vous obtenez des indices de toute façon? (Je suppose que je peux voir une utilisation pour les tableaux associatifs). –