web-dev-qa-db-fra.com

La syntaxe de la boucle for est-elle similaire à celle de Java?

Je me demande si JavaScript a une syntaxe de boucle for améliorée qui vous permet de parcourir des tableaux. Par exemple, en Java, vous pouvez simplement effectuer les opérations suivantes:

String[] array = "hello there my friend".split(" ");

for (String s : array){
    System.out.println(s);
}

la sortie est:

hello
there
my
friend

Y a-t-il un moyen de faire cela en JavaScript? Ou dois-je utiliser array.length et utiliser la syntaxe de boucle standard comme ci-dessous?

var array = "hello there my friend".split(" ");

for (i=0;i<array.length;i++){
    document.write(array[i]);
}
20
ewok

JavaScript a une boucle de style foreach- (for (x in a)), mais il est extrêmement déconseillé de l’utiliser sur une variable Array. En gros, l'approche array.length est correcte. Vous pouvez également utiliser une méthode a.forEach(fn) dans les scripts Java les plus récents, mais sa présence n'est pas garantie dans tous les navigateurs. Elle est plus lente que la méthode array.length.

EDIT 2017 : "Nous verrons comment ça se passe", en effet. .forEach() est maintenant aussi rapide ou plus rapide que for(;;), tant que la fonction est en ligne, c.-à-d. arr.forEach(function() { ... }) est rapide, foo = function() { ... }; arr.forEach(foo) pourrait ne pas l'être. On pourrait penser que les deux doivent être identiques, mais le premier est plus facile à optimiser pour le compilateur que le second.

21
Amadan

En utilisant les dernières versions de JavaScript disponibles pour la plupart des navigateurs modernes, vous pouvez procéder comme suit:

array.forEach(function(x){
  document.write(x);
});

Les détails se trouvent à l'adresse https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/forEach . Si vous craignez qu'un navigateur ne prenne pas en charge cette fonctionnalité, vous pouvez l'ajouter vous-même, en utilisant une version (espérons-le simplifiée) de la mise en oeuvre répertoriée sous "Compatibilité".

C'est un peu désuet, mais il s'agit d'une version de compatibilité réduite de forEach que j'ai dérivée de la page de Mozilla il y a quelques années:

if(!Array.prototype.forEach){Array.prototype.forEach=function(b){if(typeof b!="function"){throw new TypeError()}var a=this.length,d=arguments[1],c;for(c=0;c<a;c++){if(c in this){b.call(d,this[c],c,this)}}}};

Cela ne m'a jamais posé de problème, mais la mise en œuvre sur la page de Mozilla a depuis été complétée par quelques vérifications supplémentaires et du code pour la rendre compatible avec ECMA-262, édition 5, 15.4.4.18.

J'ai un fichier appelé common.js que j'utilise et que j'inclus sur toutes mes pages pour l'inclure, ainsi que tous les autres "extras de tableau" introduits avec JavaScript 1.6, comme indiqué à l'adresse https: //developer.mozilla. .org/fr/JavaScript/New_in_JavaScript/1.6 # Array_extras . (Je voulais obtenir cette mise à jour et publiée pour un usage public.)

Ce n'est peut-être pas l'approche la plus rapide (voir http://jsperf.com/for-vs-foreach/15 pour quelques détails - merci pour le lien, Amadan) - mais il y a quelque chose à dire pour la concision et maintenabilité, etc. De plus, il sera très intéressant de voir à quel point cette disparité est optimisée par de nouvelles améliorations du moteur JavaScript au cours des prochains mois et des prochaines années. :-)

8
ziesemer

Dans ES2015 (ES6), vous pouvez utiliser la boucle for-of. Il est pris en charge dans la plupart des navigateurs, à l'exception d'IE.

let array = [10, 20, 30];

for (let value of array) {
  console.log(value);
}

Voir l'explication de Mozilla ici

3
CaseyC

Vous pouvez faire for(s in array), mais soyez prudent, ce n'est pas la même chose que foreach.

Dans ce cas, s est la clé (index), pas la valeur. Vous devez également utiliser hasOwnProperty car in boucle également si prototype de l'objet.

for(s in array){
    if(array.hasOwnProperty(s)){
        console.log(array[s]);
    }
}

EDIT: Comme @Amadan l'a souligné, hasOwnPropertyfait itère les propriétés lorsqu'elles sont ajoutées comme ceci: array.test = function(){}. Je suggère pas en utilisant for...in.

EDIT2: Si vous utilisez un navigateur Web moderne (tout ce qui n’est pas IE <9), vous pouvez utiliser Array.forEach). @ziesemer fait remarquer que Mozilla a un shim pour cela si vous avez besoin de supporter IE <9.

array.forEach(function(s){
    console.log(s);
});

NOTE: Personnellement, j'utilise jQuery pour mes projets JavaScript et j'utilise $.each .

$.each(array, function(i,s){
    console.log(s);
});
3
Rocket Hazmat

Il existe la méthode "forEach" sur le prototype Array dans les nouveaux moteurs JavaScript. Certaines bibliothèques étendent le prototype elles-mêmes avec une méthode similaire.

2
Pointy

Essaye ça,

 var errorList = new Array();
       errorList.Push("e1");
       errorList.Push("e2");

       for (var indx in errorList){
               alert(errorList[indx]);
          }
1
shanika yrs
x = [1,2,3];
for (i in x) {
  console.log(i);
}
1
Chris Lohfink