Чому, коли я використовую це: (припускаючи 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
.