Estou lendo isso, mas estou confuso com o que está escrito na análise com um capítulo de argumento de raiz
Por que parseInt(8, 3)
→ NaN
e parseInt(16, 3)
→ 1
?
AFAIK 8 e 16 não são de base 3-números, de modo que parseInt(16, 3)
deve retornar NaN
demasiado
javascript
numbers
parseint
radix
Devid Farinelli
fonte
fonte
Respostas:
Isso é algo que as pessoas tropeçam o tempo todo, mesmo quando sabem disso. :-) Você está vendo isso pela mesma razão que
parseInt("1abc")
retorna 1:parseInt
para no primeiro caractere inválido e retorna o que tiver nesse momento. Se não houver caracteres válidos para analisar, ele retornaráNaN
.parseInt(8, 3)
significa "analisar"8"
na base 3" (observe que ele converte o número8
em uma string; detalhes nas especificações ). Mas, na base 3, os números de um dígito são apenas0
,1
e2
. É como pedir para analisar"9"
em octal. Como não havia caracteres válidos, você conseguiuNaN
.parseInt(16, 3)
está pedindo que ele analise"16"
na base 3. Como ele pode analisar o1
, ele faz e, então, para no6
porque não pode analisá-lo. Então ele retorna1
.Como essa pergunta está recebendo muita atenção e pode ter uma classificação alta nos resultados de pesquisa, aqui estão algumas opções para converter seqüências de caracteres em números em JavaScript, com suas várias idiossincrasias e aplicativos (extraídos de outra resposta minha aqui no SO):
parseInt(str[, radix])
- Converte o máximo possível do início da string em um número inteiro (inteiro), ignorando caracteres extras no final. AssimparseInt("10x")
é10
; ox
é ignorado. Suporta um argumento opcional de base (número base), assimparseInt("15", 16)
como21
(15
em hexadecimal). Se não houver raiz, assume decimal, a menos que a cadeia comece com0x
(ou0X
); nesse caso, ignora-as e assume hexadecimal. (Alguns navegadores costumavam tratar cadeias iniciando com0
octal; esse comportamento nunca foi especificado e foi especificamente proibido na especificação ES5.) RetornaNaN
se nenhum dígito analisável for encontrado.parseFloat(str)
- ComoparseInt
, mas possui números de ponto flutuante e suporta apenas decimal. Novamente, caracteres extras na string são ignorados, o mesmoparseFloat("10.5x")
ocorre10.5
(ox
é ignorado). Como apenas decimal é suportado,parseFloat("0x15")
é0
(porque a análise termina nox
). RetornaNaN
se nenhum dígito analisável for encontrado.Unário
+
, por exemplo+str
- (por exemplo, conversão implícita) Converte toda a string em um número usando ponto flutuante e a notação de número padrão do JavaScript (apenas dígitos e um ponto decimal = decimal;0x
prefixo = hex;0o
prefixo = octal [ES2015 +]; algumas implementações a estendem tratar um líder0
como octal, mas não no modo estrito).+"10x"
éNaN
porque o nãox
é ignorado. é , é , é , é [ES2015 +]. Tem uma pegadinha: é , não como você poderia esperar.+"10"
10
+"10.5"
10.5
+"0x15"
21
+"0o10"
8
+""
0
NaN
Number(str)
- Exatamente como a conversão implícita (por exemplo, a unária+
acima), mas mais lenta em algumas implementações. (Não é provável que isso importe.)fonte
parseInt
primeiros usostoString
no primeiro argumento? Isso faria sentido.parseInt
algoritmo: ecma-international.org/ecma-262/7.0/…123e-2
dá1
uma vez que se transforma em1.23
primeiro e, em seguida, a análise para no ponto decimal?NumberFormatException
cada vez.parseInt
(coagir o primeiro argumento a string) faz sentido. O objetivo deparseInt
é analisar uma string para um número inteiro. Portanto, se você der algo que não é uma string, é bom fazer com que a representação da string comece. O que ele faz depois disso é uma história totalmente diferente ...Pela mesma razão que
No documento ,
parseInt
pega uma string. EAssim
16
,8
ou'1foobar'
é primeiro convertido para string.Então
Ou seja, ele converte até onde pode. A
6
,8
efoobar
são ignorados, e só o que está antes de ser convertido. Se não houver nada,NaN
será retornado.fonte
Mais alguns exemplos:
fonte