Следующее может быть полезно в общих чертах.
Во-первых, поля формы HTML ограничены текстом . Это особенно относится к текстовым полям, даже если вы приложили все усилия, чтобы значение выглядело как число.
Во-вторых, JavaScript, к лучшему или к худшему, перегружал +
оператора двумя значениями: он добавляет числа и объединяет строки. У него есть предпочтение для конкатенации, поэтому даже выражение like 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;