Наступне може бути корисним у загальних рисах.
По-перше, поля форм HTML обмежені текстом . Особливо це стосується текстових полів, навіть якщо ви відчули, що значення виглядає як число.
По-друге, JavaScript в кращу чи гіршу сторону перевантажив +
оператора двома значеннями: додає числа, і він об'єднує рядки. Він має перевагу конкатенації, тому навіть вираз на зразок 3+'4'
буде трактуватися як конкатенація.
По-третє, JavaScript буде намагатися динамічно змінювати типи, якщо це можливо, і якщо це потрібно. Наприклад, '2'*'3'
буде змінено обидва типи на числа, оскільки ви не можете перемножувати рядки. Якщо одна з них несумісна, ви отримаєте NaN
, а не номер.
Ваша проблема виникає через те, що дані, що надходять із форми, розглядаються як рядок, а +
воля буде об'єднана, а не додана.
Читаючи нібито числові дані з форми, ви завжди повинні їх переносити через parseInt()
абоparseFloat()
залежно від того, чи хочете ви мати ціле чи десяткове число.
Зауважте, що жодна функція справді не перетворює рядок у число. Натомість він буде розбирати рядок зліва направо, поки не дістане недійсного числового символу або до кінця та перетворить прийняте. У випадкуparseFloat
, що включає одну десяткову точку, але не дві.
Все після дійсного номера просто ігнорується. Вони виходять з ладу, якщо рядок навіть не починається як число. Тоді ви отримаєте NaN
.
Гарна техніка загального призначення для чисел із форм є приблизно такою:
var data=parseInt(form.elements['data'].value); // or parseFloat
Якщо ви готові об'єднати недійсний рядок до 0, ви можете використовувати:
var data=parseInt(form.elements['data'].value) || 0;