2010-10-12 31 views
2

Je suis plutôt confus en ce moment, quelqu'un pourrait-il m'expliquer cela? Peut-être que c'est quelque chose de petit que je suis inconscient de, mais je suis confus quant à savoir pourquoi cela ne donne pas comme je le souhaite.javascript: pour (i en str), imbriqués, résultats bizarres en dehors de FF?

J'ai créé un échantillons pour montrer la question que je vois ...

Sample 1

var dataString = "abc"; 

document.write(" This is a test ... " + "<br/>") 
for (i in dataString) { 
    document.write("<br/> +" + dataString[i] + ": ") 
    for (k in dataString) { 
     document.write(" ="+dataString[k] +", "); 
    } 
} 
​ 

Maintenant, mes résultats en Chrome sont:

This is a test ... 

+a: 
+b: 

En FireFox sont: (Ceci est le résultat que je m'attendais)

This is a test ... 

+a: =a, =b, =c, 
+b: =a, =b, =c, 
+c: =a, =b, =c, 

Résultats dans IE8 sont:

This is a test ... 

Quelqu'un peut-il me expliquer ce qui se passe ici? Ai-je manqué quelque chose de critique?

Note: Vous pouvez traduire les chaînes de tableaux à travers les navigateurs utilisant comme par this example, rappelez-vous juste que ce ne soit plus une chaîne et maintenant si vous la sortie, il sera sorti comme un tableau a,b,c

Répondre

3
for (i in dataString) { 
    document.write("<br/> +" + dataString[i] + ": ") 

Il ne fait pas partie de cette cordes doivent avoir leurs caractères accessibles en tant que propriétés numérotées de la norme JavaScript (*); C'est une extension initialement introduite par Mozilla. Par conséquent dataString[i] sera undefined sur les navigateurs plus anciens, y compris IE < 8.

Pour accéder correctement à un caractère dans une chaîne, vous devez utiliser charAt.

Pour la même raison, for...in sur une chaîne ne parcourra pas les index dans tous les navigateurs.

Et même si elle le faisait, ce serait la mauvaise chose à utiliser, car for...in est pour les propriétés dans une énumération carte Object ({}), pas itérer sur des séquences. for...in ne devrait pas être utilisé sur un Array ou String car vous obtiendrez tous les membres de cette instance, pas seulement ceux qui sont indexés numériquement, et il n'y a aucune garantie que vous les obtiendrez dans un ordre particulier. La boucle correcte est la boucle ancienne for i pour Array et String Et vous devriez utiliser var même s'il s'agit d'une variable globale.

document.write(' This is a test ... <br/>'); 
for (var i= 0; i<dataString.length; i++) { 
    document.write('<br/> +'+dataString.charAt(i)+': '); 
    for (var k= 0; k<dataString.length; k++) { 
     document.write(' ='+dataString.charAt(k)+', '); 
    } 
} 

(*. Et bien ... pas ECMAScript Troisième édition La nouvelle cinquième édition indique que les chaînes ont « noms d'index de tableau », ce qui pourrait être une approbation de cette fonctionnalité semble un peu clair.)

1

selon à W3C:

L'instruction for ... in boucle les éléments d'un tableau ou les propriétés d'un objet.

Votre dataString en tant que type string et rien d'autre, le résultat que vous avez est interprété différemment sur chaque navigateur.

  • IE: datastring est pas un objet:> "Je ne boucle" (pas évident, ne correspond pas à datatype)
  • FF: datastring est un ??? : "Je crois sur chaque caractère, à la fois et combine" (très évident)
  • Chrome: dataString est un tableau de caractère: "Je itérer sur chaque caractère ". (pas évident car une chaîne peut être considérée comme un tableau de caractères, mais quand même ...)

Évident mais toujours normal.

+0

Intéressant, et tout peut être résolu si dataString stocke la valeur en tant que telle: 'var dataString = [" a "," b "," c "];' – Incognito

+1

@ user257493: Vous pouvez également utiliser 'var dataString =" abc ".split (" ")' –