85 votes

Pourquoi JavaScript gère-t-il différemment les opérateurs plus et moins entre les chaînes et les nombres?

Je ne comprends pas pourquoi JavaScript fonctionne de cette façon.

 console.log("1" + 1);
console.log("1" - 1);
 

La première ligne indique 11 et la deuxième 0. Pourquoi JavaScript traite-t-il la première en tant que chaîne et la seconde en tant que nombre?

118voto

Bernhard Hofmann Points 4741

La concaténation de chaîne est effectuée avec + sorte que Javascript convertira le premier 1 numérique en chaîne et concaténera "1" et "1" pour former "11".

Vous ne pouvez pas effectuer de soustraction sur les chaînes, donc Javascript convertit le second "1" en un nombre et soustrait 1 de 1, ce qui donne zéro.

34voto

Niet the Dark Absol Points 154811

+ "est ambigu. Il peut signifier "concaténer" ou "ajouter". Depuis le côté est une chaîne de caractères, c'est-à-dire "concaténer", d'où le résultat est 11 (qui, en passant, a été l'un de mes préférés des blagues comme un jeune enfant. Et "1 + 1 = fenêtre", comme le montre visuellement: │┼│ ニ ⊞)

- cependant n'a qu'un seul sens: la soustraction. Donc, il soustrait.

Ce genre de problème n'est pas présent dans d'autres langages tels que PHP, où "concaténer" est - . au lieu de +, sans aucune ambiguïté. Encore d'autres langues telles que MySQL n'ont même pas un opérateur de concaténation, au lieu d'utiliser CONCAT(a,b,c...).

26voto

Yury Tarabanko Points 7414

Parce que la spécification indique explicitement de le faire. Page 75. Notez la différence entre 11.6.1 les étapes 5 à 8 et 11.6.2 les étapes 5 à 7.

11.6.1 - décrit comment l'ajout de l'opérateur travaille

1-4. ...

5. Laissez lprim être ToPrimitive(lval).

6. Laissez rprim être ToPrimitive(rval).

7. Si le Type(lprim) est une Chaîne ou de Type(rprim) est une Chaîne, puis

7a. De retour de la Chaîne qui est le résultat de la concaténation ToString(lprim), suivie par ToString(rprim)

8. Retourner le résultat de l'application de l'opération d'addition à ToNumber(lprim) et ToNumber(rprim)

11.6.2 - décrit comment opérateur de soustraction œuvres

1-4. ...

5. Laissez lnum être ToNumber(lval).

6. Laissez rnum être ToNumber(rval).

7. Retourner le résultat de l'application de l'opération de soustraction à lnum et rnum

Résumé En cas de plus si l'un des opérandes lorsqu'ils sont convertis en valeur primitive sans conseil d'un coup, devient une chaîne de la seconde, est converti en une chaîne de caractères trop. Dans le cas de la soustraction des deux opérandes sont convertis en nombre.

11voto

Salman A Points 60620

Il n'est pas dédié opérateur de concaténation de chaîne en JavaScript**. L'opérateur d'addition + effectue soit la concaténation de chaîne ou de l'adjonction, selon le type des opérandes:

"1" +  1  // "11"
 1  + "1" // "11"
 1  +  1  // 2

Il n'y a pas de vis à vis de concaténation (je pense) et l'opérateur de soustraction - seulement effectue la soustraction quel que soit le type des opérandes:

"1" -  1  // 0
 1  - "1" // 0
 1  -  1  // 0
"a" -  1  // NaN

** L' . opérateur en PHP et & opérateur en VB sont dédiés chaîne des opérateurs de concaténation.

8voto

dayuloli Points 1349

+ est à la fois un opérateur d'addition pour les variables numériques, et un opérateur de concaténation de chaînes de caractères.

Dès qu'il y a une chaîne de caractères après un +, Javascript va choisir d'utiliser l' + comme un opérateur de concaténation et de les convertir (dactylographié) comme autant de conditions que possible autour de la chaîne de sorte qu'il peut les enchaîner. C'est juste le comportement de Javascript. (Si vous avez essayé, console.log(23 + 2 + "." + 1 + 5 + "02" + 02);, vous obtiendrez le résultat 25.15022. Le nombre 02 a été tapé dans la chaîne de caractères 2 avant d'être concaténées.

- ne peut être qu'un opérateur de soustraction, de sorte que quand une chaîne de caractères, il sera implicitement modifier le type de la chaîne "1" en numérique 1; si elle n'a pas à le faire, il n'y a aucun moyen "1" - 1 aurait un sens. Si vous avez essayé, console.log(23 + 2 + 1 + 5 - "02" + 03); vous obtiendrez 32 - la chaîne de caractères 02 sont converties dans le nombre 2. Le terme après l' - doit pouvoir être converti en un nombre; si vous avez essayé, console.log(23 - 2 - "." - 1 - 5 - 02 - "02"); vous obtiendrez NaN retournée.

Plus important encore, si vous avez essayé, console.log(23 + 2 + "." + 1 + 5 - "02" + 03);, il sera de sortie 26.15, où tout avant d' - a été traitée comme une chaîne (car il contient une chaîne de caractères ".", puis le terme après l' - est traité comme un numéro.

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