web-dev-qa-db-fra.com

Le signe Javascript (+) concatène au lieu de donner la somme des variables

Pourquoi quand j'utilise ceci: (en supposant que i = 1)

divID = "question-" + i+1;

Je reçois question-11 et pas question-2 ?

72
ilyo

Utilisez ceci à la place:

var divID = "question-" + (i+1)

C'est un problème assez courant qui ne se produit pas uniquement en JavaScript. L'idée est que + peut représenter les deux concaténation et addition.

Puisque l'opérateur + sera traité de gauche à droite, les décisions dans votre code se présentent comme suit:

  • "question-" + i: puisque "question-" est une chaîne, nous allons faire une concaténation, ce qui donne "question-1"
  • "question-1" + 1: puisque "queston-1" est une chaîne, nous allons faire la concaténation, ce qui donne "question-11".

Avec "question-" + (i+1) c'est différent:

  • puisque le (i+1) est entre parenthèses, sa valeur doit être calculée avant que le premier + puisse être appliqué:
    • i est numérique, 1 est numérique, nous allons donc en ajouter, ce qui donne 2
  • "question-" + 2: puisque "question-" est une chaîne, nous allons faire la concaténation, ce qui donne "question-2".
70
Joachim Sauer

Vous pouvez aussi utiliser ceci 

divID = "question-" + (i*1+1); 

pour être sûr que i est converti en entier.

34
Serafeim

Utiliser seulement:

divID = "question-" + parseInt(i) + 1;

Lorsque "n" provient du champ de saisie html ou est déclaré en tant que chaîne, vous devez utiliser une conversion explicite.

var n = "1"; //type is string
var frstCol = 5;
lstCol = frstCol + parseInt(n);

Si "n" est un entier, vous n'avez pas besoin de conversion.

n = 1; //type is int
var frstCol = 5, lstCol = frstCol + n;
18
edercortes

Puisque vous concaténez des nombres sur une chaîne, le tout est traité comme une chaîne. Lorsque vous voulez additionner des nombres, vous devez soit le faire séparément, soit l'assigner à une variable et l'utiliser, comme ceci:

i = i + 1;
divID = "question-" + i;

Ou vous devez spécifier l'ajout du numéro comme ceci:

divID = "question-" + Number(i+1);

MODIFIER

J'aurais dû ajouter cela il y a longtemps, mais selon les commentaires, cela fonctionne aussi:

divID = "question-" + (i+1);
8
Tim Hobbs
divID = "question-" + parseInt(i+1,10);

vérifier ici , c'est un JSFiddle

4
rsplak

La réponse de Joachim Sauer travaillera dans des scénarios comme celui-ci. Mais il y a des cas où l'ajout de crochets n'aidera pas.

Par exemple, vous transmettez 'la somme de la valeur d'un élément d'entrée et d'un entier' en tant qu'argument à une fonction.

arg1 = $("#elemId").val();   // value is treated as string
arg2 = 1;

someFuntion(arg1 + arg2);    // and so the values are merged here
someFuntion((arg1 + arg2));  // and here

Vous pouvez le faire fonctionner en utilisant Number()

arg1 = Number($("#elemId").val());
arg2 = 1;

someFuntion(arg1 + arg2);

ou

arg1 = $("#elemId").val();
arg2 = 1;

someFuntion(Number(arg1) + arg2);
1
musafar006
var divID = "question-" + (parseInt(i)+1);

Utiliser cet opérateur + se comporte comme concat c'est pourquoi il affiche 11.

0
Avanish Kumar

Ajouter des crochets

divID = "question-" + (i+1);
0
Billy Moon

utiliser des accolades entourant les nombres sera considéré comme une addition au lieu de concat.

divID = "question-" + (i+1)
0
niksvp

Vous obtenez cela en raison de l'ordre de priorité des opérateurs et du fait que + est utilisé à la fois pour concaténer des chaînes et pour effectuer une addition numérique.

Dans votre cas, la concaténation de "question-" et de i se produit en premier en donnant la chaîne "question = 1". Puis une autre concaténation de chaîne avec "1" donnant "question-11".

Il vous suffit simplement de donner à l'interprète un indice quant à l'ordre de priorité que vous souhaitez.

divID = "question-" + (i+1);
0
Jamiec

Une autre alternative pourrait utiliser:

divID = "question-" + i- -1;

Soustraire un négatif équivaut à ajouter, et un signe moins ne peut pas être utilisé pour la concaténation.

0
Zeke Young