Alguém sabe como posso verificar se uma variável é um número ou uma string em JavaScript?
javascript
types
Jin Yong
fonte
fonte
Respostas:
Se você está lidando com notação literal e não com construtores, pode usar typeof :.
Se você estiver criando números e seqüências de caracteres por meio de um construtor, por exemplo
var foo = new String("foo")
, lembre-se de quetypeof
pode retornarobject
parafoo
.Talvez um método mais seguro de verificar o tipo seja utilizar o método encontrado em underscore.js (a fonte anotada pode ser encontrada aqui ),
Isso retorna um booleano
true
para o seguinte:fonte
var myString = new String("stuff I like"); isString(myString)
isso retorna false. Além disso, não sei exatamente quanto tempo dura a conversão do backgroiund, sei quando chamo "oi" .length, "oi" é convertido em um objeto, não tenho certeza de quanto tempo é convertido novamente ou se isso está vinculado para a variávelA melhor maneira de fazer isso é usando a
isNaN
conversão de tipo +:Método all-in atualizado:
O mesmo usando regex:
fonte
null
é coagido a 0 e retorna true paraisNumber(null);
function is_number(n) { return /^-?[\d.]+(?:e-?\d+)?$/.test(n);}
A melhor maneira que eu encontrei é verificar um método na string, ou seja:
ou se você quiser fazer algo com o número, verifique se há uma propriedade numérica,
É como "digitar pato", depende de você de que maneira faz mais sentido. Não tenho karma suficiente para comentar, mas o typeof falha em seqüências de caracteres e números em caixas, ou seja:
alertará "objeto".
fonte
typeof
que sempre pode testar uma string, seja primitiva ou objeto String. Você só precisa testar um método exclusivo para o tipo que deseja.{substring:"hello"}
. Eu sei que, para meus propósitos, acabei de testar o que a operação específica que eu precisava fazer (módulo) faz para o tipo que eu precisava verificar (no módulo de strings retorna indefinido) e, em seguida, verifiquei isso em vez de obter seu tipo.Você está procurando
isNaN()
:Consulte Função JavaScript isNaN () em MDN.
fonte
isNaN
retornafalse
paranull
(mastrue
paraundefined
).Verifique se o valor é uma string literal ou um objeto String:
Teste de unidade:
A verificação de um número é semelhante:
fonte
function is (type, value) { return value["constructor"] === type; }
:?Desde o ES2015, a maneira correta de verificar se uma variável contém um número válido é
Number.isFinite(value)
Exemplos:
fonte
Tente isso,
fonte
Melhor maneira de fazer isso:
Isso satisfaz os seguintes casos de teste:
fonte
Ou adapte-o para retornar um tipo desconhecido:
Atualização de 12 de maio de 2012: Exemplo completo em Javascript: Um tipo melhor de .
fonte
realTypeOf
:realTypeOf(NaN) -> "Number"
qual é o mesmo comportamentotypeof
acordado, mas ainda longe do ideal.Aqui está uma abordagem baseada na idéia de coagir a entrada a um número ou sequência adicionando zero ou a sequência nula e, em seguida, faça uma comparação de igualdade digitada.
Por alguma razão insondável,
x===x+0
parece ter um desempenho melhor quex===+x
.Existem casos em que isso falha?
Na mesma veia:
Parece ser levemente mais rápido que um
x===true || x===false
outypeof x==="boolean"
(e muito mais rápido quex===Boolean(x)
).Então há também
Tudo isso depende da existência de uma operação de "identidade" específica para cada tipo que pode ser aplicada a qualquer valor e produzir de forma confiável um valor do tipo em questão. Não consigo pensar em tal operação para datas.
Para NaN, há
Esta é basicamente a versão do sublinhado e, como está, é cerca de quatro vezes mais rápida que
isNaN()
, mas os comentários na fonte do sublinhado mencionam que "NaN é o único número que não se iguala a si mesmo" e adiciona uma verificação para _.isNumber. Por quê? Que outros objetos não seriam iguais? Além disso, os sublinhados usam -x !== +x
mas que diferença o+
aqui pode fazer?Então, para o paranóico:
ou isto
fonte
Você pode dividir por 1?
Suponho que o problema seria uma entrada de string como: "123ABG"
Apenas uma maneira que eu fiz isso recentemente.
fonte
uh, que tal apenas:
Após uma análise mais aprofundada, muitos meses depois, isso garante apenas
obj
um objeto com o nome do método ou da propriedadetoLowerCase
definido. Tenho vergonha da minha resposta. Por favor, veja o mais votadotypeof
.fonte
Ou apenas use o inverso de
isNaN()
:E sim, usar o jQuery's
$.isNumeric()
é mais divertido.fonte
isNaN('123')
dá false, embora o argumento seja uma sequência numérica e não um tipo numéricoEu acho que converter o var em uma string diminui o desempenho, pelo menos esse teste realizado nos navegadores mais recentes mostra isso.
Então, se você se importa com o desempenho, eu usaria isso:
para verificar se a variável é uma string (mesmo que você use
var str = new String("foo")
,str instanceof String
retornaria true).Quanto a verificar se é um número, eu iria para o nativo
isNaN
:; função.fonte
O jQuery usa isso:
fonte
Esta solução resolve muitos dos problemas levantados aqui!
Este é de longe o método mais confiável que já usei. Não inventei isso e não consigo me lembrar de onde o encontrei originalmente. Mas funciona onde outras técnicas falham:
Exemplo de correção
fonte
typeof
método nativo (0.788s vs 1.481s) no Chrome. Este certamente é um desempenho aceitável, considerando os melhores resultados. Por que você acha que é "muito lento"? Talvez seja - no IE6 / 7/8? Mas tudo é "muito lento" nesses navegadores.typeof
seja 100x mais rápido, o que estou perdendo?Apenas um FYI, se você estiver usando jQuery, terá
para lidar com isso. Mais detalhes em http://api.jquery.com/jQuery.isNumeric/
fonte
typeof funciona muito bem para mim na maioria dos casos. Você pode tentar usar uma instrução if
onde x é qualquer nome de variável de sua escolha
fonte
a melhor maneira que encontrei, que também pensa em números positivos e negativos, é de: O'Reilly Javascript e DHTML Cookbook :
}
fonte
Errr? Basta usar expressões regulares! :)
fonte
como uma string como '1234' com typeof mostrará 'string' e o inverso nunca poderá ocorrer (typeof 123 sempre será número), o melhor é usar uma regex simples
/^\-?\d+$/.test(var)
. Ou um mais avançado para combinar números flutuantes, números inteiros e negativos./^[\-\+]?[\d]+\.?(\d+)?$/
O lado importante.test
é que ele não emitirá uma exceção se o var não for uma string, o valor pode ser qualquer coisa.Se você está procurando o tipo real, somente o typeof serve.
fonte
A resposta do @ BitOfUniverse é boa, e eu proponho uma nova maneira:
Eu sei
0
que não pode ser dividendo, mas aqui a função funciona perfeitamente.fonte
Verificação de tipo
Você pode verificar o tipo de variável usando o
typeof
operador:Verificação de valor
O código abaixo retorna verdadeiro para números e falso para qualquer outra coisa:
fonte
typeof
operador! @JustAMartinnumber
mas se eu passar '123' ou 'abc' ou qualquer outro literal citado, é uma string e não importa se pode ser analisado em um número ou não.A operação XOR pode ser usada para detectar número ou sequência. number ^ 0 sempre fornecerá o número como saída e a string ^ 0 fornecerá 0 como saída.
fonte
Simples e completo:
Casos de teste:
fonte
Basta usar
ou
se você deseja manipular cadeias definidas como objetos ou literais e salvamentos, não deseja usar uma função auxiliar.
fonte
fonte
Muito tarde para a festa; no entanto, o seguinte sempre funcionou bem para mim quando quero verificar se alguma entrada é uma sequência ou um número de uma só vez.
fonte
Criou um jsperf na verificação se uma variável é um número. Muito interessante! typeof realmente tem um uso de desempenho. Usando
typeof
algo que não seja números, geralmente aumenta 1/3 da velocidade,variable.constructor
já que a maioria dos tipos de dados em javascript são objetos; números não são!http://jsperf.com/jemiloii-fastest-method-to-check-if-type-is-a-number
typeof variable === 'number'
| mais rápido | se você deseja um número, como 5, e não '5'typeof parseFloat(variable) === 'number'
| mais rápido | se você quiser um número, como 5 e '5'isNaN()
é mais lento, mas não muito mais lento. Eu tinha grandes esperançasparseInt
eparseFloat
, no entanto, elas eram terrivelmente mais lentas.fonte
Para detectar números, a seguinte passagem do JavaScript: The Good Parts, de Douglas Crockford, é relevante:
fonte