Javascript - Brincando com números
Quando você começa a estudar sobre a estrutura léxica da Javascript, você vê que as “bizarrices” encontradas em http://wtfjs.com/ são todos comportamentos esperados! Hoje eu quero mostrar algo simples, mas que pode te ajudar bastante ao trabalhar com números em Javascript :D
Conversão de números
Em um projeto que você recebe uma entrada de dados do usuário, você precisa sempre tratar essa entrada, para saber se está realmente recebendo o valor que você espera. Vamos dar um exemplo, onde você tem uma função chamada sum()
, que soma dois números. Esses dois números são recebidos através de dois inputs
(vou deixar tudo em um só arquivo somente para exemplificar. Eviter fazer isso):
1 |
|
Esse seria mais ou menos o código que você iria utilizar para fazer a soma, correto?
Entre com dois números nos inputs e veja o resultado:
Eu entrei com os números 1
e 2
e tive como resultado… 12
!
12??? Como assim?
O Javascript recebeu os valores dos inputs da forma como eles vieram. Normalmente esses valores vêm como String
. Se você conhece a estrutura léxica do Javascript, você sabe que, ao usar o sinal de +
, ele pode tanto somar números, como concatenar strings. Quando você tem ao menos uma string em uma das partes, ele assume que o que você quer fazer é concatenar.
Então como eu posso resolver isso?
Precisamos converter esses valores de string para números, antes de efetuar a soma!
parseInt()
Temos a função parseInt(), que recebe dois parâmetros: o primeiro é o valor que você quer converter para um número inteiro, e o segundo, um número inteiro que vai representar o tipo de conversão que será feito.
No nosso caso, vamos utilizar como segundo parâmetro o número 10
, que representa números decimais.
Mudamos um pouco nossa função de soma para ficar assim:
1 | function sum( number1, number2 ) { |
Como já vimos em posts anteriores, vamos utilizar boas práticas de Clean Code. Coloquei o número 10 em uma variável chamada DECIMAL
(tudo maiúsculo, pois é convenção para constantes), para que saibamos o que significa esse segundo parâmetro.
A boa prática é nunca usar números mágicos, mas sempre atribuí-los à uma constante.
Agora tente novamente fazer a soma:
E temos o resultado correto :)
É importante frisar o uso do segundo parâmetro do parseInt()
, pois isso pode alterar o resultado final. Por exemplo:
1 | parseInt( '10px' ); // 10 |
Como você pode ver nos exemplos acima, o parseInt()
converte a string baseado nos primeiros caracteres, se o segundo parâmetro não for passado.
No primeiro e segundo exemplos, ele retorna 10
. Mas no terceiro e quarto exemplos, temos uma pequena diferença.
Quando uma string é iniciada em 0X
ou 0x
, e o segundo parâmetro não for definido, o parseInt()
entende que essa é uma notação hexadecimal, e tenta converter ao inteiro equivalente. Como 0x
é só o início da string, não retorna número algum, o resultado é NaN
(Not a number).
No quarto exemplo, nós dizemos ao parseInt()
que a string deve ser interpretada como decimal. Então ele apresenta o resultado esperado.
Muito cuidado com isso ;)
Para ver todos os tipos disponíveis para usar no segundo parâmetro, acesse https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/parseInt.
O operador +
Mas tem outra malandragem pouco conhecida para a conversão de números: o sinal de +
. Quando usado antes de uma string, e a string for um número, ele converte o tipo dessa string para Number
! Duvida? Mude a função sum()
novamente:
1 | function sum( number1, number2 ) { |
Convertemos os valores para número antes de somar e… agora nosso resultado está correto novamente!
Conclusão
A intenção desse post foi mostrar o uso do operador +
, que facilita muito na hora de converter String
para Number
, além de frisar a importância do uso do segundo parâmetro no parseInt()
.
Gostou da dica? Ficou com alguma dúvida? Comente!
Até a próxima!
Sobre o #1postperday: https://blog.da2k.com.br/2014/12/31/um-post-por-dia/
Tem alguma sugestão para os próximos posts do #1postperday? Deixe ela aqui: https://github.com/fdaciuk/fdaciuk.github.io/issues/1