396 votes

Pourquoi éviter les opérateurs d'incrémentation ("++") et de décrémentation ("-") en JavaScript?

Je suis un grand fan de Douglas Crockfords' écrit sur le JavaScript, en particulier son livre JavaScript: Les Bonnes Parties. C'est fait de moi un meilleur programmeur JavaScript et un meilleur programmeur en général. L'un de ses conseils pour son jslint outil est ceci :

++ et --
Le ++ (incrémentation) et - (décrémenter) les opérateurs ont été connus pour contribuer à un mauvais code par encourager excessive trickiness. Ils sont en second lieu seulement à des défauts de l'architecture en permettant à des virus et d'autres la sécurité de menaces. Il y a un plusplus option qui interdit l'utilisation de ces des opérateurs.

Cela a toujours frappé mon gut "oui, cela a du sens", mais m'a agacé quand j'ai besoin d'une condition de bouclage et ne peut pas trouver une meilleure façon de contrôler la boucle à un while( a < 10 )do { a++ } ou for (var i=0;i<10;i++) { } et l'utilisation jslint. Il m'a mis au défi d'écrire différemment. Je sais aussi que dans le passé lointain, à l'aide de choses à dire à PHP comme $foo[$bar++] je me suis retrouvée en difficulté avec tout-en-un d'erreurs.

Y C-comme les langues ou dans d'autres langues que le manque d'++" et "--" de la syntaxe ou de la traiter différemment?

Existe-il d'autres justifications pour éviter "++" et "--" que je pourrais être absent?


Mise à JOUR -- 9 avril 2010:

Dans la vidéo Crockford sur JavaScript-Partie 5: La Fin de Toutes Choses, Douglas Crockford adresses de l' ++ question plus directement et avec plus de détails. Il apparaît à 1:09:00 dans la timeline. Vaut la peine de regarder.


Mise à JOUR -- 5 décembre 2011:

Crockford de nouveau, à partir d'un autre excellent YUI Théâtre: Crockford sur JavaScript - partie 8: Programmation de Style Et de Votre Cerveau (50:42)


445voto

cdmckay Points 11234

Mon point de vue est de toujours utiliser ++ et - par eux-mêmes sur une seule ligne, comme dans:

 i++;
array[i] = foo;
 

au lieu de

 array[++i] = foo;
 

Tout ce qui va au-delà peut être déroutant pour certains programmeurs et ne vaut tout simplement pas la peine à mon avis. Les boucles for sont une exception, car l'utilisation de l'opérateur increment est idiomatique et donc toujours claire.

262voto

Jon B Points 26872

Franchement, je suis confus par ce Conseil. Partie de moi se demande si elle a plus à voir avec un manque d’expérience (réelle ou perçue) avec des codeurs javascript. Je peux voir comment quelqu'un juste « bidouiller » à certains exemples de code pourrait faire une erreur innocente avec ++ et--, mais je ne vois pas pourquoi un professionnel expérimenté leur éviterait.

71voto

Eclipse Points 27662

Il y a une histoire à C de faire des choses comme:

while (*a++ = *b++);

pour copier une chaîne de caractères, c'est peut-être la source de l'excès de la ruse, il se réfère.

Et il y a toujours la question de ce qu'

++i = i++;

ou

i = i++ + ++i;

effectivement le faire. Elle est définie dans certaines langues, et dans d'autres, il n'y a aucune garantie de ce qui va arriver.

Ces exemples mis à part, je ne pense pas qu'il n'y a rien de plus idiomatique que d'une boucle for qui utilise ++ d'augmentation. Dans certains cas, vous pourriez sortir avec une boucle foreach, ou une boucle while qui a vérifié un autre service. Mais contorting votre code d'essayer et d'éviter d'utiliser l'incrémentation est ridicule.

55voto

Nosredna Points 33670

Si vous lisez JavaScript Les Bonnes Pièces, vous verrez que Crockford remplacement de l'i++ en un pour boucle est i+=1 (pas de i=i+1). C'est assez propre et lisible, et est moins susceptible de se transformer en quelque chose "difficile."

Crockford fait de rejeter des autoincrement et autodecrement une option dans jsLint. Vous pouvez choisir de suivre les conseils ou pas.

Ma règle est de ne rien faire, combiné avec incrémentation automatique ou autodecrement.

J'ai appris de plusieurs années d'expérience en C que je n'ai pas de dépassements de mémoire tampon (ou tableau de l'indice hors limites) si je continue à l'utiliser simple. Mais j'ai découvert que je ne reçois dépassements de la mémoire tampon si je tombe dans le "trop difficile" pratique de faire d'autres choses dans le même énoncé.

Donc, pour mes propres règles, l'utilisation de l'i++ comme l'augmentation de l'un de boucle est très bien.

18voto

Eric Points 8793

Considérons le code suivant

	int a[10];
	a[0] = 0;
	a[1] = 0;
	a[2] = 0;
	a[3] = 0;
	int i = 0;
	a[i++] = i++;
	a[i++] = i++;
	a[i++] = i++;

depuis que j'ai++ obtient évalué deux fois la sortie est (à partir de vs2005 débogueur)

	[0]	0	int
	[1]	0	int
	[2]	2	int
	[3]	0	int
	[4]	4	int

Maintenant, considérons le code suivant :

	int a[10];
	a[0] = 0;
	a[1] = 0;
	a[2] = 0;
	a[3] = 0;
	int i = 0;
	a[++i] = ++i;
	a[++i] = ++i;
	a[++i] = ++i;

Notez que le résultat est le même. Maintenant, vous pourriez penser que ++i et i++ sont les mêmes. Ils ne sont pas

	[0]	0	int
	[1]	0	int
	[2]	2	int
	[3]	0	int
	[4]	4	int

Enfin d'envisager ce code

	int a[10];
	a[0] = 0;
	a[1] = 0;
	a[2] = 0;
	a[3] = 0;
	int i = 0;
	a[++i] = i++;
	a[++i] = i++;
	a[++i] = i++;

La sortie est maintenant :

	[0]	0	int
	[1]	1	int
	[2]	0	int
	[3]	3	int
	[4]	0	int
	[5]	5	int

Donc ils ne sont pas les mêmes, mélange des deux-être pas si intuitive comportement. Je pense que pour les boucles sont ok avec ++, mais attention quand vous avez plusieurs ++ symboles sur la même ligne ou la même instruction

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X