Você pode usar o typeof
operador:
var booleanValue = true;
var numericalValue = 354;
var stringValue = "This is a String";
var stringObject = new String( "This is a String Object" );
alert(typeof booleanValue) // displays "boolean"
alert(typeof numericalValue) // displays "number"
alert(typeof stringValue) // displays "string"
alert(typeof stringObject) // displays "object"
Exemplo desta página da web . (O exemplo foi ligeiramente modificado).
Isso não funcionará como esperado no caso de strings criadas com new String()
, mas isso raramente é usado e recomendado contra [1] [2] . Veja as outras respostas para saber como lidar com elas, se desejar.
- O Google JavaScript Style Guide diz para nunca usar wrappers de objetos primitivos .
- Douglas Crockford recomendou que os invólucros de objetos primitivos fossem descontinuados .
new String('foo')
, mas isso não importa porque as seqüências de caracteres agrupadas são um recurso inútil que você não deveria estar usando. O guia de estilo do Google os proíbe , Douglas Crockford os quer reprovados e nenhuma biblioteca os usa. Finja que eles não existem e usetypeof
sem medo.typeof
não recomendou que fosse preterido também?Isto é o que funciona para mim:
fonte
instanceof
verificação aqui é um ruído inútil, a menos que você esteja seguindo algumas práticas de codificação muito incomuns , e esta resposta não explica nada o que faz ou por que você pode usá-lo. A única razão pela qual você precisaria disso é se você usar seqüências de caracteres agrupadas a objetos, mas essas são um recurso inútil que ninguém usa, e Google e Crockford condenam as práticas recomendadas ( google-styleguide.googlecode.com/svn/ trunk /… , crockford.com/javascript/recommend.html ).typeof
einstanceof
parecer um bom conselho se o seu código puder ser chamado por outros. @ Opostmessage
caso de ponta do MarkAmery importa se você está perguntando "o que eu acabei de fazerpostmessage
?" - mas você espera que isso seja tratado na interface e não tenha permissão para se propagar. Em outros lugares, parece correto lidar com métodos de codificação não preteridos, mesmo que alguns esteticistas de JS os desaprovem. NUNCA comente seu código como aceitando String, a menos que realmente aceite!Como mais de 580 pessoas votaram em uma resposta incorreta e mais de 800 votaram em uma resposta funcional, mas no estilo de espingarda, pensei que poderia valer a pena refazer minha resposta de uma forma mais simples que todos possam entender.
Ou, inline (eu tenho uma configuração do UltiSnip para isso):
Para sua informação, a resposta de Pablo Santa Cruz está errada, porque
typeof new String("string")
éobject
A resposta da DRAX é precisa e funcional e deve ser a resposta correta (já que Pablo Santa Cruz está definitivamente definitivamente incorreto, e não vou argumentar contra o voto popular).
No entanto, essa resposta também é definitivamente correta e, na verdade, a melhor resposta (exceto, talvez, a sugestão de usar lodash / sublinhado ). isenção de responsabilidade: eu contribuí para a base de código do lodash 4.
Minha resposta original (que obviamente voou sobre muitas cabeças) é a seguinte:
Eu transcodifiquei isso de underscore.js:
Isso definirá isString, isNumber, etc.
No Node.js, isso pode ser implementado como um módulo:
[edit]:
Object.prototype.toString.call(x)
trabalha para delinear também entre funções e funções assíncronas:fonte
global || window
vez de,window
mas isso seria uma péssima abordagem para resolver um problema que você não deveria ter em primeiro lugar).myObject+"" === myObject
se um objeto é uma string (ou melhor ainda, eu não digitaria check-in em um sistema de tipo orientado a comportamento).toString
noObject.prototype
. Então, eu argumentaria que confiar natoString
verificação do tipo de um objeto é, na melhor das hipóteses, uma má prática.Eu recomendo usar as funções internas do jQuery ou lodash / Underscore . Eles são mais simples de usar e mais fáceis de ler.
Qualquer uma das funções manipulará o caso DRAX mencionado ... ou seja, ambos verificam se (A) a variável é uma string literal ou (B) é uma instância do objeto String. Nos dois casos, essas funções identificam corretamente o valor como sendo uma sequência.
lodash / Underscore.js
jQuery
Consulte a documentação do lodash para _.isString () para obter mais detalhes.
Veja a documentação do jQuery para $ .type () para mais detalhes.
fonte
_.every()
é um pouco confuso para usar no começo, e algo tão simples quanto_.isBoolean()
confundiu desenvolvedores na minha empresa. Um desenvolvedor pensou erroneamente que seria falso se o valor fosse booleano e falso. Inglês é mais fácil de ler do que alemão para mim, porque eu não sei alemão. Aprenda JavaScript e tudo fará sentido.Eu vi isso aqui:
http://perfectionkills.com/instanceof-considered-harmful-or-how-to-write-a-robust-isarray/
fonte
Object.prototype.toString.call(obj) === '[object String]'
?(x === y)
tem melhor legibilidade do quex === y
?Melhor maneira:
Cada um deles foi construído por sua função de classe apropriada, como "new Object ()" etc.
Além disso, digitação de pato: "Se ele se parece com um pato, anda como um pato e cheira a pato - deve ser uma matriz" Significado, verifique suas propriedades.
Espero que isto ajude.
Editar; 05/05/2016
Lembre-se, você sempre pode usar combinações de abordagens também. Aqui está um exemplo do uso de um mapa de ações embutido com typeof :
Aqui está um exemplo mais "real" do uso de mapas em linha:
Esta função usaria [custom] "conversão de tipo" - em vez disso, "tipo - / - mapeamento de valor" - para descobrir se uma variável realmente "existe". Agora você pode dividir esse cabelo desagradável entre
null
&0
!Muitas vezes você nem se importa com seu tipo . Outra maneira de contornar a digitação é combinar conjuntos do tipo pato:
Ambos
Number.prototype
eString.prototype
têm um.toString() method
. Você apenas certificou-se de que o número da string equivalente ao número fosse o mesmo e, em seguida, certificou-se de que o passasse para ahttp
função como aNumber
. Em outras palavras, nem nos importamos com o tipo.Espero que isso lhe dê mais para trabalhar :)
fonte
(o.constructor === Number || s.constructor === Boolean)
). Anedoticamente,parseInt
eNaN
são ferramentas frágeis, mas poderosas. Lembre-se de que Não é um número NÃO é um número e pode ser definido indefinido.if(thing.call) { 'its a function'; }
ouif(thing.defineProperties) { 'its an object'; }
. Obrigado pela contribuição, axkibe!Sinceramente, não vejo por que não se usaria
typeof
neste caso:Sim, falhará com as seqüências de caracteres agrupadas a objetos (por exemplo
new String('foo')
), mas elas são amplamente consideradas como uma prática ruim e a maioria das ferramentas de desenvolvimento modernas provavelmente desencorajará seu uso. (Se você vir um, basta corrigi-lo!)O
Object.prototype.toString
truque é algo que todos os desenvolvedores de front-end foram considerados culpados de fazer um dia em suas carreiras, mas não o deixem enganar por seu polimento inteligente: ele será quebrado assim que algo corrigir o protótipo do Object:fonte
Eu gosto de usar esta solução simples:
fonte
undefined
enull
, e ainda obter a resposta certa para cadeias vazias (ambas''
enew String('')
).(mystring || false) && mystring.constructor === String
. Eu usei false, caso seja usado em uma função que deve retornar um booleano.Este é um ótimo exemplo de por que o desempenho é importante:
Fazer algo simples como um teste para uma string pode ser caro se não for feito corretamente.
Por exemplo, se eu quisesse escrever uma função para testar se algo é uma string, poderia fazê-lo de duas maneiras:
1)
const isString = str => (Object.prototype.toString.call(str) === '[object String]');
2)
const isString = str => ((typeof str === 'string') || (str instanceof String));
Ambos são bem diretos, então o que poderia impactar o desempenho? De um modo geral, as chamadas de funções podem ser caras, especialmente se você não sabe o que está acontecendo lá dentro. No primeiro exemplo, há uma chamada de função ao método toString do Object. No segundo exemplo, não há chamadas de função, pois typeof e instanceof são operadores. Os operadores são significativamente mais rápidos que as chamadas de função.
Quando o desempenho é testado, o exemplo 1 é 79% mais lento que o exemplo 2!
Veja os testes: https://jsperf.com/isstringtype
fonte
typeof str === 'string' || str instanceof String
(pode soltar o parêntese que eu prefiro nosif (..)
casos); independentemente, a verificação dos tipos primitivo e de objeto em # 2 é clara e suficiente. Essas verificações devem ser "raras" de qualquer maneira.Funciona para literais de seqüência de caracteres
let s = 'blah'
e para seqüências de caracteres de objetolet s = new String('blah')
fonte
Retirado de lodash:
fonte
Penso que a solução @customcommander deve ser suficiente em 90% dos seus casos:
Deve atendê-lo corretamente (simplesmente porque normalmente não há motivo para ter
new String('something')
no seu código).Se você também estiver interessado em manipular o
String
objeto (por exemplo, espera alguma var de terceiros), usar o lodash como sugerido pelo @ ClearCloud8 parece uma solução clara, simples e elegante.No entanto, eu sugeriria ser cauteloso com bibliotecas como a lodash devido ao seu tamanho. Em vez de fazer
O que traz todo o enorme objeto lodash, sugiro algo como:
E com o pacote simples, você deve ficar bem (refiro-me aqui ao código do cliente).
fonte
Se você trabalha no ambiente node.js., pode simplesmente usar a função interna isString nos utils.
Edit: como @Jehy mencionado, isso está obsoleto desde a v4.
fonte
typeof value === 'string'
vez disso".x = new String('x'); x.isString(x);
retorna falso . Existe,util.types.isStringObject()
porém, que retorna false para ox = 'x'
tipo string. Duas funções utilitárias que não fornecem absolutamente nenhuma utilidade ...O método a seguir verificará se alguma variável é uma sequência ( incluindo variáveis que não existem ).
fonte
Também descobri que isso funciona bem também, e é muito mais curto que os outros exemplos.
Ao concatenar aspas vazias, ele transforma o valor em uma sequência. Se
myVar
já é uma sequência, a instrução if é bem-sucedida.fonte
typeof
.typeof
mas ainda um pouco mais rápido quetoString
. De qualquer forma, acho que gosto da sintaxe para coagir.var s = new String('abc'); > s === s + '' > false
new String
cus que cria um tipo deobject
. w3schools.com/js/tryit.asp?filename=tryjs_string_object2fonte
false
.Eu acho essa técnica simples útil para verificar o tipo de String -
A mesma técnica também funciona para o Number -
E para RegExp -
Mesmo para Objeto -
NB, regexps, matrizes e funções também são considerados objetos.
Mas, verificar a matriz é um pouco diferente -
Essa técnica não funciona para Funções, no entanto -
fonte
var x = new String(x); String(x)===x
retorna falso. no entanto,({}).toString.call(x).search(/String/)>0
sempre retorna para coisas difíceisfunction isClass(x,re){return ({}).toString.call(x).search(re)>0;};
isClass("hello",/String/)
orisClass(3,/Number/)
orisClass(null,/Null/)
Uma solução simples seria:
fonte
toString()
função.toString
nenhum valor; tente se o x a ser verificado é nulo ou indefinido, seu código lança exceçãotoString()
método pode ser substituído e pode gerar uma exceção (devido a alguma implementação específica), e sua verificação não funcionará com certeza. A idéia principal é que você não deve chamar métodos que não estejam relacionados ao que você deseja obter. Nem estou falando de sobrecarga desnecessária relacionada aotoString
método. Downvoting.Um auxiliar Typechecker:
uso:
Além disso, se você quiser que seja recursivo (como Matriz que é um Objeto), você pode usar
instanceof
.(
['cs'] instanceof Object //true
)fonte
Vou seguir uma rota diferente para o resto aqui, que tenta dizer se uma variável é um tipo específico, ou membro de um conjunto específico, de tipos.
JS é construído em ducktyping; se algo se intrometer como uma string, podemos e devemos usá-la como uma string.
É
7
uma string? Então, por que/\d/.test(7)
funciona?É
{toString:()=>('hello there')}
uma string? Então, por que({toString:()=>('hello there')}) + '\ngeneral kenobi!'
funciona?Estas não são perguntas sobre se o trabalho acima funciona, o ponto é que elas funcionam.
Então, eu fiz uma
duckyString()
função.Abaixo, testo muitos casos não atendidos por outras respostas. Para cada um o código:
duckyString()
a normalização de entradas para código que espera strings reaisIsso é da mesma maneira que
!!x
o contráriox===true
e teste se algo é semelhante a um array em vez de precisar de um array real.objetos jQuery; eles são matrizes? Não. Eles são bons o suficiente? Sim, você pode executá-los através de
Array.prototype
funções muito bem.É essa flexibilidade que dá à JS seu poder, e o teste de strings especificamente torna seu código menos interoperável.
A saída do acima é:
Então, é tudo sobre por que você quer saber se algo é uma string.
Se, como eu, você chegou aqui do Google e queria ver se havia algo parecido com uma corda , aqui está uma resposta.
Não é nem caro, a menos que você esteja trabalhando com matrizes de caracteres muito longas ou profundamente aninhadas.
Isso ocorre porque são todas as declarações if, nenhuma função é chamada
.toString()
.Exceto se você estiver tentando ver se uma matriz de caracteres com objetos que possuem apenas
toString()
caracteres de vários bytes ou, nesse caso, não há outra maneira de verificar, exceto para criar a string e contar os caracteres que os bytes compõem, respectivamenteEstão incluídas opções para
.toString()
)Aqui estão mais testes porque eu sou um completista:
Resultado:
fonte
Apenas para expandir a resposta da @ DRAX , eu faria o seguinte:
Ele também será responsável por
null
s eundefined
tipos e cuidará de tipos não-string, como0
.fonte
Isso é bom o suficiente para mim.
AVISO: Esta não é uma solução perfeita. Veja a parte inferior do meu post.
E você pode usar isso como abaixo.
AVISO: Isso funciona incorretamente no caso:
fonte
Você pode usar esta função para determinar o tipo de qualquer coisa:
Para verificar se uma variável é uma sequência:
https://codepen.io/patodiblasi/pen/NQXPwY?editors=0012
fonte
Não sei se você quer saber se é um tipo,
string
independentemente de seu conteúdo, ou se é um número ou sequência de caracteres, independentemente de seu tipo.Portanto, para saber se seu tipo é uma sequência, isso já foi respondido.
Mas, para saber, com base em seu conteúdo, se é uma string ou um número, eu usaria isso:
E para alguns exemplos:
fonte
/^\d+$/.test('123')
para evitar as complexidades de problemas potenciais de análise)