O seguinte pode ser útil em termos gerais.
Primeiro, os campos do formulário HTML são limitados ao texto . Isso se aplica especialmente às caixas de texto, mesmo que você tenha se esforçado para garantir que o valor pareça um número.
Segundo, o JavaScript, para o bem ou para o mal, sobrecarregou o +operador com dois significados: adiciona números e concatena as strings. Tem uma preferência por concatenação, portanto, mesmo uma expressão como 3+'4'será tratada como concatenação.
Terceiro, o JavaScript tentará alterar os tipos dinamicamente, se puder, e se for necessário. Por exemplo '2'*'3', os dois tipos serão alterados para números, pois você não pode multiplicar cadeias. Se um deles for incompatível, você receberá NaN, Não é um número.
Seu problema ocorre porque os dados provenientes do formulário são considerados como uma seqüência de caracteres e +, portanto, concatenam em vez de adicionar.
Ao ler dados supostamente numéricos de um formulário, você deve sempre enviá-los parseInt()ou parseFloat(), dependendo se você deseja um número inteiro ou um decimal.
Observe que nenhuma das funções converte verdadeiramente uma seqüência de caracteres em um número. Em vez disso, ele analisará a sequência da esquerda para a direita até chegar a um caractere numérico inválido ou até o final e converterá o que foi aceito. No caso de parseFloat, isso inclui um ponto decimal, mas não dois.
Qualquer coisa após o número válido é simplesmente ignorada. Eles falham se a string nem começa como um número. Então você receberá NaN.
Uma boa técnica de propósito geral para números de formulários é algo como isto:
var data=parseInt(form.elements['data'].value); // or parseFloat
Se você estiver preparado para combinar uma sequência inválida a 0, poderá usar:
var data=parseInt(form.elements['data'].value) || 0;