w3schools - verify if is a number javascript




Como “+ var===+var” funciona internamente para verificar se var é numérico? (3)

Vendo esta pergunta: Existe uma maneira (incorporada) no JavaScript para verificar se uma string é um número válido? e this: jsperf , uma das abordagens apresentadas é esta (mutatis mutandis):

var a = "123"
var b = "123b"

if ( +a === +a ) // true

if ( +b === +b ) // false

Como essa lógica funciona internamente no JavaScript para tornar isso possível?

Minha pergunta não é como verificar se uma string é um número válido - isso já foi respondido aqui: Valide números decimais em JavaScript - IsNumeric () . Eu quero entender como a declaração +a === +a funciona.


As duas variáveis ​​são string, mas o javascript converte automaticamente qualquer string em um número quando você + ou - .

var a = "1";
var b = a;     // b = "1": a string
var c = +a;    // c = 1: a number
var d = -a;    // d = -1: a number

e basicamente no seu exemplo, você tenta fazer isso:

if ( +"123" === +"123" )  => ( 123 === 123) // true
if ( +"123b" === +"123b" ) => (NaN === NaN) // false

O operador + aqui é conhecido como o Unary Plus .

O operador unary plus precede seu operando e avalia seu operando, mas tenta convertê-lo em um número, se já não estiver.

+"123" avaliado como 123 .

+a === +a
-> +"123" === +"123"
  -> 123 === 123
    -> true

+"123b" avaliado como NaN (não é um número) , como o caractere b não pode ser convertido com o Unary Plus, pois sem nenhum prefixo (como 0x para hexadecimal), o Unary Plus assumirá que o valor é decimal (0-9). NaN é um caso especial, pois não se compara a nada, inclusive a si próprio:

NaN === NaN
-> false

NaN !== NaN
-> true

Por esse motivo, nosso caso de teste +b falha:

+b === +b
-> +"123b" === +"123b"
  -> NaN === NaN
    -> false

Se você deseja que ambos sejam avaliados como true, podemos adicionar uma chamada isNaN() no final:

if ( +a === +a || isNaN(+a) )

if ( +b === +b || isNaN(+b) )

+ converte o valor em um número.

a é convertido em 123 e 123 === 123 .

b é convertido em NaN mas NaN !== NaN (porque NaN nunca é igual a outro NaN acordo com a etapa 4a das regras de igualdade ).





numbers