32 votes

Comment fonctionne l'ajout de chaîne de caractères avec un entier en JavaScript ?

Le code suivant donne des résultats étranges :

console.log("" + 1 + 10 + 2 - 5 + "8");

J'ai essayé d'entrer différentes valeurs pour comprendre mais je ne peux pas comprendre ce qui se passe sous le capot.

69voto

Phrogz Points 112337
"" + 1          === "1"
"1" + 10        === "110"
"110" + 2       === "1102"
"1102" - 5      === 1097
1097 + "8"      === "10978"

En JavaScript, l'opérateur + est utilisé à la fois pour l'addition numérique et la concaténation de chaînes de caractères. Lorsque vous "ajoutez" un nombre à une chaîne, l'interpréteur convertit votre nombre en chaîne de caractères et les concatène toutes les deux.

En revanche, lorsque vous utilisez l'opérateur -, la chaîne est convertie en nombre pour permettre la soustraction numérique.

Ensuite, lorsque vous "ajoutez" la chaîne "8", la concaténation de chaînes se produit à nouveau. Le nombre 1097 est converti en la chaîne "1097", puis joint avec "8".

11voto

Ahmad Points 4329

chaîne + nombre = chaîne concaténée

nombre + nombre = la somme des deux nombres

chaîne - nombre = la différence entre (la chaîne forcée) et le nombre

explication :

Si l'un ou les deux opérandes est une chaîne, alors le plus est considéré comme un opérateur de concaténation de chaîne plutôt que d'ajouter des nombres.

L'opérateur moins essaie toujours de convertir les deux opérandes en nombres.

donc :

"" + 1 + 10 + 2 = (chaîne) "1102"    
"1102" - 5      = (nombre)  1097
1097 + "8"      = (chaîne) "10798"

5voto

zer00ne Points 3056
  1. Ceci est une chaîne de caractères pas un nombre--""
  2. Ceci est une chaîne de caractères pas un nombre--"1"
  3. Ceci est une chaîne de caractères pas un nombre--"1" <+> "10" = "1"+"10" = "110"
  4. Ceci est une chaîne de caractères pas un nombre--"1" <+> "10" <+> "2" = "1"+"10"+"2" = "1102"
  5. Ceci est un nombre parce qu'il n'y a pas de confusion sur un opérateur moins--1102 - 5 = 1097
  6. Ceci est une chaîne de caractères pas un nombre--"1097" <+> "8" = "1097"+"8" = "10978"

EXTRAIT

document.getElementById("1").innerHTML = "";

document.getElementById("2").innerHTML = "" + 1;

document.getElementById("3").innerHTML = "" + 1 + 10;

document.getElementById("4").innerHTML = "" + 1 + 10 + 2

document.getElementById("5").innerHTML = "" + 1 + 10 + 2 - 5

document.getElementById("6").innerHTML = "" + 1 + 10 + 2 - 5 + "8";

3voto

timje Points 239

Ce site contient des informations utiles.

JavaScript est très souple en ce qui concerne la différence entre les chaînes de caractères et les nombres.

...

Donc, si vous utilisez + sur une chaîne de caractères et un nombre, JavaScript va convertir le nombre en chaîne de caractères pour vous. Mieux encore, si vous en avez besoin, vous pouvez traiter les nombres comme des chaînes de caractères ou les chaînes de caractères comme des nombres.

Inversement, si vous appliquez des opérations mathématiques sur une chaîne de caractères, JavaScript va essayer de la convertir en nombre. Si la chaîne de caractères ne peut pas être interprétée comme un nombre (par exemple, s'il y a des lettres dedans), JavaScript renvoie NaN (Not a Number).

1voto

Travis J Points 28588

Alors que + et - peuvent avoir la même Précédence de l'opérateur, ils n'ont pas les mêmes règles de conversion implicite.

Comme - signifie toujours soustraction de nombres en JavaScript, l'utilisation de - tentera toujours de convertir implicitement en entier à la fois le côté gauche et le côté droit de l'expression.

Dans ce cas, comme la précédence de l'opérateur est la même et l'évaluation se fait de gauche à droite, on obtient donc (""+1+10+2) en utilisant la conversion explicite en chaîne de caractères de + pour la concaténation de chaînes, soit la chaîne de caractères "1102". Ensuite, le - tentera implicitement de convertir la chaîne "1102" en nombre, ainsi que le nombre 5, ce qui donnera 1102-5, soit le nombre 1097. À ce stade, la chaîne "8" est concaténée implicitement en utilisant +, et le résultat final peut être vu : la chaîne de caractères "10978".

Une alternative intéressante aurait peut-être été ""+1+10+2-5+8, ce qui aurait donné 1097+8, soit le nombre 1105.

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