Pourquoi Jshint ne reconnaît-il pas une affectation comme expression?

Comment dois-je modifier ces lignes pour que jshint soit heureux?

Une affectation est une expression. Pourquoi ne comprend-il pas cela? Évidemment, l'interprète le fait.

Line 572: while(bookmark_element=bookmark_list[iterator++]) Expected a conditional expression and instead saw an assignment. Line 582: while(bookmark_element=bookmark_list[iterator++]) Expected a conditional expression and instead saw an assignment. Line 623: while(element_iterator=element_iterator.nextSibling) Expected a conditional expression and instead saw an assignment. 

Si vous souhaitez vraiment écouter JSHint, convertissez l'expression en booléen en:

 while (!!(bookmark_element=bookmark_list[iterator++])) ! means: Something that evaluates to true is converted to false, something that evaluates to false is converted to true. 

Alors, !! Signifie: Convertir quelque chose en représentation conditionnelle.

 /*jshint boss:true */ 

Expérimentez avec les options .

Je suis sûr que jshint comprend l'expression bien, c'est juste que la plupart des gens qui écrivent if (a = b) réellement signifié if (a == b) et cela génère un avertissement.

Puisque votre code est ce que vous vouliez, vous pouvez ajouter un test explicite:

 while ((element_iterator = element_iterator.nextSibling) !== null) { ... } 

Il existe au moins deux façons de résoudre l'erreur signalée, selon JSHint docs .

  1. Ajouter /*jshint boss:true */ before conditional statement
  2. Déclaration Wrap dans des parenthèses supplémentaires, c.-à while ((element_iterator = element_iterator.nextSibling)) {...}

Personnellement, je pense que les parenthèses supplémentaires sont les meilleures pratiques car elle conserve la vérification d'erreur, mais elle est toujours logique. En ajoutant le !! Avant, en réalité, rien ne transforme l'expression en vrai / faux en arrière et en arrière deux fois supplémentaires.

C'est une expression, et vous pouvez la modifier pour fonctionner avec JSHint (même si ce n'est pas sympa):

 while(element_iterator.nextSibling) { element_iterator = element_iterator.nextSibling; 

Pour votre dernier exemple. Cependant, vous n'avez pas besoin de le faire. JSHint n'est qu'un outil pour vous aider à améliorer les habitudes de codage et corriger les erreurs, mais étant donné que ce que vous avez est clair, concis et (à mon avis) la meilleure façon de le faire – ignorez ces messages.

Jshint ne peut pas dire si vous avez vraiment l'intention de faire une affectation dans le bloc de condition, ou si cela était vraiment censé être une comparaison. L'inquiétude serait que d'autres humains pourraient avoir le même doute.

Dans le cas d'un itérateur, je pense que vous allez bien.

J'ai eu cette erreur parce que j'avais une virgule de départ dans une déclaration précédant la fonction:

 this.foo = "bar", // <- Error was here this.myfunc = function() { ... // <- Error reported on this line }; 

(C'était difficile à trouver, mais renforce mon opinion selon laquelle les linters ont généralement raison, c'est mon code qui ne va pas. Si j'avais désactivé les avertissements dans le monde entier – ou même à cet endroit – le bug aurait toujours été présent. </lecture> )