Подтвердить что ты не робот

Знак Javascript (+) объединяет вместо суммы переменных

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

divID = "question-" + i+1;

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

4b9b3361

Ответ 1

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

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".

Ответ 2

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

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

чтобы убедиться, что i преобразуется в целое число.

Ответ 3

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

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;

Ответ 4

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

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

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

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

ИЗМЕНИТЬ

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

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

Ответ 6

Ответ Joachim Sauer будет работать в таких сценариях. Но есть случаи, когда добавление скобок не поможет.

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

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);

Ответ 7

Добавить скобки

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

Ответ 8

используя фигурные скобки, окружающие числа, будет рассматриваться как дополнение вместо concat.

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

Ответ 9

Причина, по которой вы получаете это, - это порядок предсказуемости операторов и тот факт, что + используется как для конкатенации строк, так и для выполнения числового добавления.

В вашем случае происходит объединение "question-" и i, сначала задающее строку "question = 1". Затем еще одна конкатенация строк с "1", дающая "вопрос-11".

Вам просто нужно дать интерпретатору подсказку о том, какой порядок прецедента вы хотите.

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

Ответ 10

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

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

Ответ 11

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

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

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

Ответ 12

Следует позаботиться о том, чтобы i представлял собой целочисленный тип переменной. В javaScript мы не указываем тип данных во время объявления переменных, но наша инициализация может гарантировать, что наша переменная имеет определенный тип данных.

Хорошей практикой является инициализация переменных объявления:

  • В случае целых чисел var num = 0;
  • В случае строк, var str = "";

Даже если ваша переменная i целочисленная, оператор + может выполнить конкатенацию вместо сложения.

В вашем проблемном случае вы предположили, что i = 1, чтобы получить 2 в дополнение к 1, попробуйте использовать (i-1+2). Использование () -parenthesis не потребуется.

- (минус оператор) не может быть неправильно понято, и вы не получите неожиданный результат/ы.

Ответ 13

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

Использовать parseInt (i), чем значение "i" будет передано в Integer.

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

В вашем случае сделайте следующее: -

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

Ответ 14

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

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

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