Чому, коли я використовую це: (припускаючи 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;
Використовуйте лише:
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;
"question-" + parseInt(i) + 1 === ("question-" + parseInt(i)) + 1. Докладніше див. У відповіді Йоахіма. Крім того, (+i)це parseInt(i)
divID = "question-" + (parseInt(i) + 1)
parseIntне має називатися номером.
parseInt(i, 10). Я не розумію, як ця відповідь, яка залишається абсолютно неправильною на сьогоднішній день , отримала 21 голос проти.
Оскільки ви об'єднуєте числа в рядок, все це трактується як рядок. Коли ви хочете скласти числа разом, вам потрібно зробити це окремо і призначити його var і використовувати цей var, наприклад:
i = i + 1;
divID = "question-" + i;
Або вам потрібно вказати додавання номера таким чином:
divID = "question-" + Number(i+1);
РЕДАГУВАТИ
Я повинен був це додати давно, але виходячи з коментарів, це також працює:
divID = "question-" + (i+1);
NumberНе потрібно, тільки дужки.
Numberколи змінна спочатку призначається, а потім це не призводить до того, що інші речі передаються в рядки.
divID = "question-" + parseInt(i+1,10);
перевірте тут , це JSFiddle
parseInt, просто панелі навколо номера. jsfiddle.net/J8rvy
parseIntза номером, лише за допомогою рядка. parseInt(1e100) === 1.
Причиною цього ви є порядок переваги операторів та той факт, що +використовується як для об’єднання рядків, так і для виконання числового додавання.
У вашому випадку об'єднання "питання-" та i відбувається спочатку, даючи рядок "question = 1". Потім ще одна конкатенація рядків із "1", що дає "питання-11".
Вам просто потрібно дати перекладачеві підказку щодо того, який порядок попередньої підготовки ви хочете.
divID = "question-" + (i+1);
Відповідь Йоахіма Зауера спрацює у подібних сценаріях. Але є деякі випадки, коли додавання дужок не допоможе.
Наприклад: Ви передаєте "суму значення вхідного елемента та ціле число" як аргумент функції.
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);
string + number + numberде number + numberслід робити додавання, перш ніж об'єднувати його в string. Справа взагалі не string + numberв тому, де stringчисловий і +завжди слід робити додавання.
Іншою альтернативою може бути використання:
divID = "question-" + (i - -1);
Віднімання мінуса - це те саме, що додавання, а мінус не можна використовувати для конкатенації
Редагувати: забув, що дужки все ще необхідні, оскільки код читається зліва направо.
var divID = "question-" + (parseInt(i)+1);
Використовуйте цей +оператор, щоб поводитись так concat, тому він показує 11.
Слід бути обережним, що iце ціла кількість змінної. У javaScript ми не вказуємо тип даних під час оголошення змінних, але наша ініціалізація може гарантувати, що наша змінна має певний тип даних.
Доброю практикою є ініціалізація змінних оголошення:
var num = 0;var str = "";Навіть якщо ваша iзмінна є цілим числом, +оператор може виконувати конкатенацію замість додавання.
У випадку з вашою проблемою ви припустили це i = 1, щоб отримати 2додаткову інформацію про 1спробу використання (i-1+2). Використання ()-розділу не буде необхідним.
- (мінус оператор) не можна неправильно зрозуміти, і ви не отримаєте несподіваних результатів.
i - 1 + 2; використовуйте Numberфункцію замість цього, якщо iце не число.
Одне місце, в якому пропозиція дужок не вдається, це якщо, скажімо, обидва числа є вхідними змінними HTML. Скажімо, a і b - це змінні, і ми отримуємо їх значення наступним чином (я не фахівець з HTML, але мій син зіткнувся з цим, і рішення дужок не було, тобто
Дякуємо за допомогу, просто FYI - це дуже заплутало, і я його тато закричав на те, що "це було виною Blogger.com" - ні, це особливість введення HTML за замовчуванням у поєднанні з оператором "додавання", коли вони трапляються разом, інтерпретація за замовчуванням для всіх і будь-якої вхідної змінної є такою для рядка, а отже оператор додавання діє, природно, у своїй подвійній / паралельній ролі тепер як оператор конкатенації, оскільки, як ви пояснювали вище, це протокол інтерпретації лівого вирівнювання у Java та Java-скрипті після цього. Дуже цікавий факт. Ви, люди, запропонували рішення, я додаю деталі для інших, хто стикається з цим.
string + number + numberде number + numberслід робити додавання, перш ніж об'єднувати його в string. Справа взагалі не string + numberв тому, де stringчисловий і +завжди слід робити додавання. <input type="number">має valueAsNumber, тож мова не йде саме про HTML. praseIntслід викликати з аргументом radix; Numberє кращим. +не є оператором додавання, коли він не робить додавання.
Просто як легко ... кожен тип введення, якщо він не визначений у HTML, розглядається як рядок. Через це оператор плюс "+" об'єднується.
Використовуйте parseInt (i), ніж значення "i" буде передано в Integer.
Тоді оператор "+" буде працювати як додавання.
У вашому випадку зробіть так: -
divID = "question-" + parseInt(i)+1;
parseIntза номером, лише за допомогою рядка. parseInt(1e100) === 1.