web-dev-qa-db-fra.com

L'erreur "++ inattendue" dans jslint

Qu'est-ce que est alors la meilleure pratique?

Jslint explique que cela "ajoute de la confusion". Je ne le vois pas vraiment ...

EDIT: Le code, tel que demandé:

  var all,l,elements,e;
  all = inElement.getElementsByTagName('*');
  l = all.length;
  elements = [];
  for (e = 0; e < l; (e++))
  {
    if (findIn)
    {
        if (all[e].className.indexOf(className) > 0)
        {
            elements[elements.length] = all[e];
        }
    } else {
        if (all[e].className === className)
        {
            elements[elements.length] = all[e];
        }
    }
  }
144
KdgDev

Utilisation i += 1 à la place, si vous souhaitez suivre les conseils de jslint.

92
unomi

Ajoutez simplement /*jslint plusplus: true */ devant votre fichier javascript.

88
Rico Sonntag

Pour éviter toute confusion et tout problème éventuel lors de l’utilisation de minificateurs, entourez toujours les parens entre l’opérateur et son opérande lorsqu’ils sont utilisés avec le même (+ ou -).

var i = 0, j = 0;
alert(i++ +j);

Cela ajoute i et j (et incrémente i en tant qu’effet secondaire), ce qui a pour conséquence que 0 est alerté.

Mais qu'est-ce que quelqu'un arrive et déplace l'espace?

var i = 0, j = 0;
alert(i+ ++j);

Maintenant, ce premier incrémente j, puis ajoute i à la nouvelle valeur de j, ce qui entraîne l’alerte de 1.

Cela pourrait facilement être résolu en faisant

var i = 0, j = 0;
alert((i++) +j); 

Maintenant, cela ne peut pas être trompé.

28
Sean Kinsey

Personnellement, je préfère mettre des déclarations telles que i++ sur une ligne par eux-mêmes. Les inclure dans une déclaration plus large peut semer la confusion chez ceux qui ne savent pas vraiment ce que la ligne est censée faire.

Par exemple, au lieu de:

value = func(i++ * 3);

Je ferais ceci:

value = func(i * 3);
i++;

Cela signifie également que les gens ne doivent pas se rappeler comment i++ et ++i fonctionne, et supprime la nécessité d’appliquer un si grand nombre de règles de préférence.

14
Samir Talwar

Le vrai problème du ++ opérateur est qu’il s’agit d’un opérateur ayant des effets secondaires et s’oppose donc totalement au principe de la programmation fonctionnelle.

Le "fonctionnel" moyen d'implémenter i++ serait i = i + 1 où vous réaffectez explicitement la variable sans effets secondaires, puis utilisez-la.

La possibilité de confusion est que ++ fait deux choses en ajoutant une valeur ET en la réaffectant à la variable.

9
benzonico

Boucle amicale JSLint

for (i = 0; i < 10; i += 1) {
    //Do somthing
}
7

Veuillez noter que l'opérateur ++ dépend de la position par rapport à la variable précédente/suivante et de la nouvelle ligne/point-virgule pour déterminer l'ordre des opérations.

var a = 1;
var b = a++;
console.log(b); // b = 1
console.log(a); // a = 2

var a = 1;
var b = ++a;
console.log(b); // b = 2
console.log(a); // a = 2
4

Il y a ce qu'on appelle une pré-incrémentation: ++ i et une post-incrémentation i ++ et il y a une différence:

var i = 9;
alert(++i); //-> alerts 10

var j = 9;
alert(j++); //-> alerts 9
alert(j);   //-> alerts 10 now, as expected

var k = 9;
alert((k++)); //-> still alerts 9 even with extra parentheses
3
Paul Scheltema