Je sais que c'est une question très ancienne, mais je ne suis satisfait à 100% d'aucune des réponses car elles semblent toutes incomplètes. Donc, nous revenons des premiers principes:
L'objectif général de l'utilisateur:
Résumant le code: "Je souhaite ajouter un error
nom de classe à une chaîne, éventuellement avec un espace au début s'il y a déjà des noms de classe dans la chaîne."
La solution la plus simple
Comme Kobi l'a souligné, il y a 5 ans, avoir un espace de premier plan dans les noms de classe ne posera aucun problème avec les navigateurs connus, donc la solution correcte la plus courte serait en fait:
h.className += ' error';
Cela aurait dû être la vraie réponse au problème réel .
Quoi qu'il en soit, les questions posées étaient ...
1) Pourquoi cela a-t-il fonctionné?
h.className += h.className ? ' error' : 'error'
L'opérateur conditionnel / ternaire fonctionne comme une instruction if, qui attribue le résultat de ses chemins true
ou false
à une variable.
Donc, ce code a fonctionné car il est évalué simplement comme:
if (h.className IS NOT null AND IS NOT undefined AND IS NOT '')
h.className += ' error'
else
h.className += 'error'
2) et pourquoi cette rupture?
h.className = h.className + h.className ? ' error' : 'error'
La question indique "qui donne une erreur [n] dans ma console", ce qui peut vous induire en erreur en pensant que le code ne fonctionne pas . En fait, le code suivant s'exécute, sans erreur , mais il renvoie simplement «erreur» si la chaîne n'était pas vide et «erreur» si la chaîne était vide et ne répondait donc pas aux exigences .
Ce code aboutit toujours à une chaîne qui contient uniquement ' error'
ou 'error'
parce qu'il évalue ce pseudo code:
if ((h.className + h.className) IS NOT null AND IS NOT undefined AND IS NOT '')
h.className = ' error'
else
h.className = 'error'
La raison en est que l'opérateur d'addition ( +
aux gens du commun) a une "priorité" plus élevée (6) que l'opérateur conditionnel / ternaire (15). Je sais que les chiffres apparaissent à l'envers
La préséance signifie simplement que chaque type d'opérateur dans une langue est évalué dans un ordre prédéfini particulier (et pas seulement de gauche à droite).
Comment changer l'ordre d'évaluation:
Maintenant que nous savons pourquoi cela échoue, vous devez savoir comment le faire fonctionner.
Certaines autres réponses parlent de changer la priorité , mais vous ne pouvez pas . La préséance est câblée dans la langue. Ce n'est qu'un ensemble fixe de règles ... Cependant, vous pouvez changer l' ordre d'évaluation ...
L'outil de notre boîte à outils qui peut changer l'ordre d'évaluation est l'opérateur de regroupement (aka parenthèses). Pour ce faire, il s'assure que les expressions entre crochets sont évaluées avant les opérations en dehors des crochets. C'est tout ce qu'ils font, mais c'est suffisant.
Les parenthèses fonctionnent simplement parce qu'elles (opérateurs de regroupement) ont une priorité plus élevée que tous les autres opérateurs ("il y a maintenant un niveau 0").
En ajoutant simplement des crochets, vous modifiez l'ordre d'évaluation pour vous assurer que le test conditionnel est effectué en premier, avant la simple concaténation de chaînes:
h.className = h.className + (h.className ? ' error' : 'error')
Je vais maintenant laisser cette réponse à la rouille invisible parmi les autres :)
h.className += ' error'
, cela laisse également un espace vide au début de la chaîne si elle était initialement vide. Je crois que le but de l'opération ternaire est de produire une corde d'apparence propre.