Почему, когда я использую это: (предполагая i = 1
)
divID = "question-" + i+1;
Я получаю вопрос-11, а не вопрос-2?
Почему, когда я использую это: (предполагая i = 1
)
divID = "question-" + i+1;
Я получаю вопрос-11, а не вопрос-2?
Используйте это вместо:
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"
.Вы также можете использовать этот
divID = "question-" + (i*1+1);
чтобы убедиться, что i
преобразуется в целое число.
Использовать только:
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;
Поскольку вы объединяете числа в строку, все это рассматривается как строка. Если вы хотите добавить числа вместе, вам нужно сделать это отдельно и назначить его var и использовать этот var, например:
i = i + 1;
divID = "question-" + i;
Или вам нужно указать добавление номера следующим образом:
divID = "question-" + Number(i+1);
ИЗМЕНИТЬ
Я должен был добавить это давно, но, основываясь на комментариях, это также работает:
divID = "question-" + (i+1);
divID = "question-" + parseInt(i+1,10);
проверьте его здесь, это JSFiddle
Ответ 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);
Добавить скобки
divID = "question-" + (i+1);
используя фигурные скобки, окружающие числа, будет рассматриваться как дополнение вместо concat.
divID = "question-" + (i+1)
Причина, по которой вы получаете это, - это порядок предсказуемости операторов и тот факт, что +
используется как для конкатенации строк, так и для выполнения числового добавления.
В вашем случае происходит объединение "question-" и i
, сначала задающее строку "question = 1". Затем еще одна конкатенация строк с "1", дающая "вопрос-11".
Вам просто нужно дать интерпретатору подсказку о том, какой порядок прецедента вы хотите.
divID = "question-" + (i+1);
var divID = "question-" + (parseInt(i)+1);
Используйте этот оператор +
, который ведет себя как concat
, поэтому он показывает 11.
Другой альтернативой может быть использование:
divID = "question-" + i- -1;
Вычитание минуса - это то же самое, что и сложение, а минус нельзя использовать для объединения
Следует позаботиться о том, чтобы i
представлял собой целочисленный тип переменной. В javaScript мы не указываем тип данных во время объявления переменных, но наша инициализация может гарантировать, что наша переменная имеет определенный тип данных.
Хорошей практикой является инициализация переменных объявления:
var num = 0;
var str = "";
Даже если ваша переменная i
целочисленная, оператор +
может выполнить конкатенацию вместо сложения.
В вашем проблемном случае вы предположили, что i = 1
, чтобы получить 2
в дополнение к 1
, попробуйте использовать (i-1+2)
. Использование ()
-parenthesis не потребуется.
-
(минус оператор) не может быть неправильно понято, и вы не получите неожиданный результат/ы.
Простой и легкий... каждый тип ввода, если он не определен в HTML, рассматривается как строка. Из-за этого оператор Plus "+" конкатенируется.
Использовать parseInt (i), чем значение "i" будет передано в Integer.
Чем оператор "+" будет работать как сложение.
В вашем случае сделайте следующее: -
divID = "question-" + parseInt(i)+1;
В одном месте предложение скобок оказывается неудачным, если сказать, что оба числа являются входными переменными HTML. Скажем, a и b являются переменными, и каждый получает их значения следующим образом (я не эксперт по HTML, но мой сын столкнулся с этим и не было никакого решения в скобках, то есть
Спасибо за помощь просто FYI - был очень запутанным, и я его отец закричал на "то, что было ошибкой Blogger.com" - нет его функции ввода HTML по умолчанию в сочетании с оператором "добавления", когда они происходят вместе, стандартная левосторонняя интерпретация по умолчанию и любая входная переменная - это строка, и, следовательно, оператор сложения действует естественным образом в своей двойной/параллельной роли в качестве оператора конкатенации, поскольку, как вы объяснили выше, это тип выравнивания по левому краю протокола интерпретации в Java и Java script. Очень интересный факт. Вы, люди, предложили решение, добавляю детали для других, которые сталкиваются с этим.