Javascript (+) знак объединяет вместо того, чтобы давать сумму переменных - PullRequest
73 голосов
/ 11 мая 2011

Почему, когда я использую это: (при условии i = 1)

divID = "question-" + i+1;

я получаю вопрос-11 , а не вопрос-2 ?

Ответы [ 13 ]

71 голосов
/ 11 мая 2011

Используйте это вместо:

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

Это довольно распространенная проблема, которая встречается не только в JavaScript.Идея состоит в том, что + может представлять как конкатенацию, так и сложение.

Поскольку оператор + будет обрабатываться слева направо, решения в вашем коде выглядят следующим образом:

  • "question-" + i: поскольку "question-" является строкой, мы выполним конкатенацию, в результате чего "question-1"
  • "question-1" + 1: поскольку "queston-1" является строкой, мы будемсделать конкатенацию, в результате чего "question-11".

С "question-" + (i+1) это отличается:

  • , поскольку (i+1) в скобках, его значение должно быть вычислено допервый + может быть применен:
    • i числовой, 1 числовой, поэтому мы сделаем сложение, в результате чего 2
  • "question-" + 2: поскольку "question-" является строкой, мы сделаем конкатенацию, в результате чего "question-2".
34 голосов
/ 11 мая 2011

Вы также можете использовать это

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

, чтобы убедиться, что i конвертируется в целое число.

18 голосов
/ 08 ноября 2013

Использование только:

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

Когда "n" приходит из поля ввода html или объявляется как строка, вам нужно использовать явное преобразование.

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

Если "n" является целым числом, преобразование не требуется.

n = 1; //type is int
var frstCol = 5, lstCol = frstCol + n;
8 голосов
/ 11 мая 2011

Поскольку вы объединяете числа в строку, все это рассматривается как строка. Если вы хотите сложить числа вместе, вам нужно либо сделать это отдельно, и присвоить его переменной, и использовать эту переменную, например:

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

Или вам нужно указать добавление номера следующим образом:

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

EDIT

Я должен был добавить это давно, но, основываясь на комментариях, это также работает:

divID = "question-" + (i+1);
4 голосов
/ 11 мая 2011
divID = "question-" + parseInt(i+1,10);

проверьте здесь , это JSFiddle

1 голос
/ 14 марта 2014

Ответ Йоахима Зауэра будет работать в подобных сценариях. Но в некоторых случаях добавление скобок не поможет.

Например: вы передаете «сумму значений входного элемента и целого числа» в качестве аргумента функции.

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

Вы можете заставить его работать, используя Number()

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

someFuntion(arg1 + arg2);

или

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

someFuntion(Number(arg1) + arg2);
0 голосов
/ 22 сентября 2018

Другой альтернативой может быть использование:

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

Вычитание минуса - то же самое, что и сложение, и минус нельзя использовать для конкатенации

0 голосов
/ 12 июля 2016
var divID = "question-" + (parseInt(i)+1);

Используйте этот + оператор, ведущий себя как concat, поэтому он показывает 11.

0 голосов
/ 01 декабря 2015

Простой как легкий ... каждый тип ввода, если он не определен в HTML, рассматривается как строка. Из-за этого оператор «+» объединяется.

Используйте parseInt (i), тогда значение «i» будет приведено к Integer.

Чем оператор «+» будет работать как сложение.

В вашем случае сделайте это: -

divID = "question-" + parseInt(i)+1;
0 голосов
/ 15 августа 2014

Одно из предложений в скобках не выполняется, если, скажем, оба числа являются входными переменными HTML.Скажем, a и b являются переменными, и каждый получает их значения следующим образом (я не эксперт по HTML, но мой сын столкнулся с этим, и не было решения для скобок, т. Е.

  • Входные данные HTML были предназначены для числовых значений переменных aи b, так сказать, входные данные были 2 и 3.
  • Следующее дало выходные данные конкатенации строк: a + b отображается 23; + a + b отображается 23; (a) + (b) отображается 23;
  • Из приведенных выше предложений мы попытались успешно: число (a) + число (b) отображается 5; parseInt (a) + parseInt (b) отображается 5.

Спасибо за помощь, просто к сведению- был очень запутанным, и я его папа кричал на «это была ошибка Blogger.com» - нет, это особенность ввода по умолчанию HTML в сочетании с оператором «сложения», когда они встречаются вместе, по умолчанию интерпретация всех по левому краюи любая входная переменная - это строка, и, следовательно, оператор сложения действует естественно в своей двойной / параллельной роли теперь как оператор конкатенации, поскольку, как вы, ребята, объяснили выше, этотип интерпретации левого выравнивания протокола Java и сценарий Java после этого.Очень интересный факт.Вы, ребята, предложили решение, я добавляю подробности для тех, кто сталкивается с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...