Знак Javascript (+) об'єднується замість подання суми змінних


76

Чому, коли я використовую це: (припускаючи i = 1)

divID = "question-" + i+1;

Я отримую питання-11, а не питання-2 ?


javascript спочатку додає значення i до рядка, а потім 1
jcubic

Відповіді:


77

Використовуйте замість цього:

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

Працював, дякую! але ти можеш сказати мені, в чому різниця?
ilyo

1
@IlyaD - Оператор, що відповідає пріоритету оператора, - це Додавання, яке обробляється зліва направо. Отже, він робить щось на зразок:divID = ("question-" + i) + 1;
Майстер тіней робить щеплення

1
Цей dint працює в моєму випадку, наприклад, "Питання" + (i + j) він передбачав обидві змінні як рядок, краще використовувати наступне рішення як "question-" + (i * 1 + j)
Локеш

Я був здивований, що зараз це не спрацювало: console.log ('Додати рядок міста:' + (i + 1)); Навіть маючи математику в дужках, це об’єднує їх.
Рікаел,

Чудовий опис того, чому це відбувається.
apex

33

Ви також можете використовувати це

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

щоб бути впевненим у цьому i перетворюється на ціле число.


18

Використовуйте лише:

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;

6
Ця відповідь дуже неправильна. Проблемою залишається те, що об’єднання та додавання є лівоасоціативними . Тобто: "question-" + parseInt(i) + 1 === ("question-" + parseInt(i)) + 1. Докладніше див. У відповіді Йоахіма. Крім того, (+i)це parseInt(i)
коротше,

1
Синтаксис повинен був бути:divID = "question-" + (parseInt(i) + 1)
Panini Luncher

3
Ця відповідь абсолютно помилкова. І parseIntне має називатися номером.
Івол

Якщо що, синтаксис міг бути включений parseInt(i, 10). Я не розумію, як ця відповідь, яка залишається абсолютно неправильною на сьогоднішній день , отримала 21 голос проти.
Себастьян Саймон

Єдине рішення, яке працювало для мене, - це те, що стосується парен, не працювало в моєму випадку.
mimi

9

Оскільки ви об'єднуєте числа в рядок, все це трактується як рядок. Коли ви хочете скласти числа разом, вам потрібно зробити це окремо і призначити його var і використовувати цей var, наприклад:

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

Або вам потрібно вказати додавання номера таким чином:

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

РЕДАГУВАТИ

Я повинен був це додати давно, але виходячи з коментарів, це також працює:

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

4
NumberНе потрібно, тільки дужки.
Jamiec

Так, побачивши інші відповіді тут, я це зрозумів. Я точно не js-гуру. Я думав, вам потрібно було віддати додаток за допомогою Number, але я повинен був знати. JS просто здається здатним "розібратися", що є одним із справді крутих аспектів мови. Дякую за коментар.
Тім Хоббс,

Це ідеально підходить для моїх потреб. Замість рядкового літералу я мав змінну, яку я призначив із введення тексту. Я використовую, Numberколи змінна спочатку призначається, а потім це не призводить до того, що інші речі передаються в рядки.
DCShannon

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

перевірте тут , це JSFiddle


6
Вам не потрібні parseInt, просто панелі навколо номера. jsfiddle.net/J8rvy
Jamiec

2
+1, у мене було багато проблем із цілими числами у моєму власному проекті, тому я використовую parseInt занадто багато зараз хе-хе
rsplak

2
Ніколи не дзвоніть parseIntза номером, лише за допомогою рядка. parseInt(1e100) === 1.
Oriol


0

використання фігурних дужок навколо чисел буде розглядатися як додавання замість concat.

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

0

Причиною цього ви є порядок переваги операторів та той факт, що +використовується як для об’єднання рядків, так і для виконання числового додавання.

У вашому випадку об'єднання "питання-" та i відбувається спочатку, даючи рядок "question = 1". Потім ще одна конкатенація рядків із "1", що дає "питання-11".

Вам просто потрібно дати перекладачеві підказку щодо того, який порядок попередньої підготовки ви хочете.

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

0

Відповідь Йоахіма Зауера спрацює у подібних сценаріях. Але є деякі випадки, коли додавання дужок не допоможе.

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

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

1
Ця відповідь не стосується питання. Питання в тому, string + number + numberде number + numberслід робити додавання, перш ніж об'єднувати його в string. Справа взагалі не string + numberв тому, де stringчисловий і +завжди слід робити додавання.
Себастьян Саймон

0

Іншою альтернативою може бути використання:

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

Віднімання мінуса - це те саме, що додавання, а мінус не можна використовувати для конкатенації

Редагувати: забув, що дужки все ще необхідні, оскільки код читається зліва направо.


Забули додати дужки. Працює без дужок у деяких випадках, але не у всіх.
Zinger

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

Використовуйте цей +оператор, щоб поводитись так concat, тому він показує 11.


-1

Слід бути обережним, що iце ціла кількість змінної. У javaScript ми не вказуємо тип даних під час оголошення змінних, але наша ініціалізація може гарантувати, що наша змінна має певний тип даних.

Доброю практикою є ініціалізація змінних оголошення:

  • У разі цілих чисел, var num = 0;
  • У випадку рядків, var str = "";

Навіть якщо ваша iзмінна є цілим числом, +оператор може виконувати конкатенацію замість додавання.

У випадку з вашою проблемою ви припустили це i = 1, щоб отримати 2додаткову інформацію про 1спробу використання (i-1+2). Використання ()-розділу не буде необхідним.

- (мінус оператор) не можна неправильно зрозуміти, і ви не отримаєте несподіваних результатів.


Як ініціалізуються змінні, тут не має значення. Дужки все ще потрібні; це оператор групування, який формує певний пріоритет операції. Не робіть i - 1 + 2; використовуйте Numberфункцію замість цього, якщо iце не число.
Себастьян Саймон

-2

Одне місце, в якому пропозиція дужок не вдається, це якщо, скажімо, обидва числа є вхідними змінними HTML. Скажімо, a і b - це змінні, і ми отримуємо їх значення наступним чином (я не фахівець з HTML, але мій син зіткнувся з цим, і рішення дужок не було, тобто

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

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


Ця відповідь не стосується питання. Питання в тому, string + number + numberде number + numberслід робити додавання, перш ніж об'єднувати його в string. Справа взагалі не string + numberв тому, де stringчисловий і +завжди слід робити додавання. <input type="number">має valueAsNumber, тож мова не йде саме про HTML. praseIntслід викликати з аргументом radix; Numberє кращим. +не є оператором додавання, коли він не робить додавання.
Себастьян Саймон

-2

Просто як легко ... кожен тип введення, якщо він не визначений у HTML, розглядається як рядок. Через це оператор плюс "+" об'єднується.

Використовуйте parseInt (i), ніж значення "i" буде передано в Integer.

Тоді оператор "+" буде працювати як додавання.

У вашому випадку зробіть так: -

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

1
Ніколи не дзвоніть parseIntза номером, лише за допомогою рядка. parseInt(1e100) === 1.
Оріол
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.