117 votes

La priorité de l'opérateur avec Javascript opérateur Ternaire

Je ne peux pas semblent envelopper ma tête autour de la première partie du présent code ( += ) en combinaison avec l'opérateur ternaire.

h.className += h.className ? ' error' : 'error'

Je crois que ce code fonctionne est la suivante:

h.className = h.className + h.className ? ' error' : 'error'

Mais ce n'est pas correct, car cela donne une erreur dans ma console.

Donc ma question est comment dois-je interpet correctement ce code?

141voto

Kobi Points 65357
h.className = h.className + (h.className ? ' error' : 'error')

Vous voulez à l'opérateur de travailler pour h.className, mieux vaut être précis à ce sujet.
Bien sûr, aucun préjudice doit venir de l' h.className += ' error', mais c'est une autre affaire.

Notez également que, + a la préséance sur l'opérateur ternaire: JavaScript Priorité de l'Opérateur

129voto

Wayne Koorts Points 4954

Pensez-y de cette façon:

<variable> = <expression> ? <true clause> : <false clause>

La façon dont l'instruction est exécuté est fondamentalement comme suit:

  1. N' <expression> true ou false?
  2. Si <expression> a la valeur true, alors la valeur de <true clause> est attribué à l' <variable>, <false clause> est ignoré, et la prochaine instruction est exécutée.
  3. Si <expression> a la valeur false, alors <true clause> est ignorée et la valeur de <false clause> est attribué à l' <variable>.

La chose importante à réaliser avec l'opérateur ternaire dans ce domaine et dans d'autres langues, c'est que quel que soit le code est en <expression> devrait produire un résultat booléen lors de l'évaluation: vrai ou faux.

Dans le cas de votre exemple remplacer "assignés" dans mon explication avec "à", ou similaire quelle que soit la sténographie de l'arithmétique que vous utilisez, le cas échéant.

10voto

David Hedlund Points 66192

L' += fait ce que vous voulez, mais dans le ternaire déclaration à la main droite, il vérifie si h.className est falsey, qu'il serait si c'était pas défini. Si c'est truthy (c'est à dire si un nom de classe est déjà spécifié), puis d'erreur est ajouté avec un espace (c'est à dire l'ajout d'une nouvelle classe), sinon il est ajouté, sans l'espace.

Le code peut être réécrite comme vous le suggérez, mais vous devez le spécifier h.className doit être utilisé pour truthiness-comparaison, plutôt que pour l'utilisation de sa valeur réelle, dans l'opérateur ternaire, alors assurez-vous de ne vous embêtez pas avec la concaténation des valeurs en même temps que de faire votre ternaire de l'opération:

h.className = h.className + (h.className ? ' error' : 'error');

4voto

Justin Johnson Points 16243

Le côté droit de l' = opérateur est évaluée de gauche à droite. Donc,

g.className = h.className + h.className ? ' error' : 'error';`

est équivalent à

h.className = (h.className + h.className) ? ' error' : 'error';

Pour être équivalent à

h.className += h.className ? ' error' : 'error';

vous devez séparer le ternaire énoncé entre parenthèses

h.className = h.className + (h.className ? ' error' : 'error');

3voto

Darin Dimitrov Points 528142
if (h.className) {
    h.className = h.className + ' error';
} else {
    h.className = h.className + 'error';
}

devrait être l'équivalent de:

h.className += h.className ? ' error' : 'error';

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