Como posso verificar se um var é uma string em JavaScript?


Respostas:


381

Você estava perto:

if (typeof a_string === 'string') {
    // this is a string
}

Em uma nota relacionada: a verificação acima não funcionará se uma string for criada com new String('hello')o tipo em Objectvez disso. Existem soluções complicadas para contornar isso, mas é melhor evitar criar strings dessa maneira, sempre.


1
Pessoal, eu realmente daria uma resposta aceita para vocês dois, mas não posso, tudo o que posso fazer é marcar com +1 para ambos, do que dar a resposta aceita para quem está mais próximo do meu problema específico, que eu não tenho. totalmente explicado.
vitto

Isso funcionou para mimif(typeof(str) === typeof(String()))
Scott Murphy

78

O typeofoperador não é um infixo (portanto, o LHS do seu exemplo não faz sentido).

Você precisa usá-lo assim ...

if (typeof a_string == 'string') {
    // This is a string.
}

Lembre-se, typeofé um operador, não uma função. Apesar disso, você verá typeof(var)ser muito utilizado na natureza. Isso faz tanto sentido quanto var a = 4 + (1).

Além disso, você também pode usar ==(operador de comparação de igualdade), já que os dois operandos são Strings ( typeof sempre retorna a String), o JavaScript é definido para executar as mesmas etapas que eu usei ===(operador de comparação estrita).

Como o Box9 menciona , isso não detectará um Stringobjeto instanciado .

Você pode detectar isso com ....

var isString = str instanceof String;

jsFiddle .

...ou...

var isString = str.constructor == String;

jsFiddle .

Mas isso não funcionará em um windowambiente múltiplo (pense iframe).

Você pode contornar isso com ...

var isString = Object.prototype.toString.call(str) == '[object String]';

jsFiddle .

Mas, novamente (como o Box9 menciona ), é melhor você usar apenas o Stringformato literal , por exemplo var str = 'I am a string';.

Leitura adicional .


1
@ Box9 Não se preocupe, eu sou representante cobertas de qualquer maneira: P
alex

@alex agora estou muito: o (mais 10 minutos!)
David Tang

3
O @RobG Rep capped é quando você obtém o representante máximo por um período de 24 horas. Depois disso, os votos positivos não contam para a sua reputação.
alex

Não é possível verificar se uma variável é uma sequência simplesmente testando a presença de um membro que apenas as sequências possuem? Por exemplo if(myVar.toUpperCase) alert('I am a string');:? Veja: jsfiddle.net/tb3t4nsx
ingrediente_15939

1
@ ingrediente_15939 não é realmente uma boa maneira ... por causa de{ toUpperCase: '' }
alex

14

A combinação das respostas anteriores fornece estas soluções:

if (typeof str == 'string' || str instanceof String)

ou

Object.prototype.toString.call(str) == '[object String]'

4

A expressão a seguir retorna true :

'qwe'.constructor === String

A expressão a seguir retorna true :

typeof 'qwe' === 'string'

A expressão a seguir retorna false (sic!):

typeof new String('qwe') === 'string'

A expressão a seguir retorna true :

typeof new String('qwe').valueOf() === 'string'

Melhor e melhor caminho ( imho ):

if (someVariable.constructor === String) {
   ...
}

1

Hoje em dia, acredito que é preferível usar uma função de typeof (), então ...

if(filename === undefined || typeof(filename) !== "string" || filename === "") {
   console.log("no filename aborted.");
   return;
}

não existe uma forma de função typeof, você está apenas controlando a ordem das operações com esses parênteses. Algumas pessoas podem achar mais legível em determinadas circunstâncias.
Jon z

@ Jonz O que você quis dizer com "controlar a ordem das operações"? Obrigado.
2020

Acho que depois percebi que você pode verificar o construtor e preferir, pois na teoria eu pensei que seria mais rápido, mas não é mais rápido? O exemplo número 4 aqui mostra o uso de parênteses developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… é definitivamente mais legível e menos para uma análise de compilador a considerar. Meu palpite sobre a 'ordem' é possivelmente um problema de velocidade ou relacionado a como o compilador carrega a pilha de argumentos, não tenho certeza.
Master James

1
@ a20 ordem de operações descreve a ordem em que as operações são executadas para instruções que contêm várias operações. Consulte developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/… - parênteses (agrupamento operacional) têm a maior precedência do operador e, portanto, são avaliados primeiro. Nesse caso, os parênteses em torno de filenameapenas agrupam uma única declaração e, portanto, são inúteis e estranhos. É bom que esta resposta tenha uma pontuação 0, porque é errada, enganosa e inútil; seria melhor se tivesse uma pontuação negativa.
Jon z

Muito informativo obrigado pelo link. Então os parênteses são verificados e executados primeiro? para que seja executado imediatamente sem verificar a seguir outras formas de ligar, também conhecidas como sem parênteses, quais seriam as etapas mais tarde e mais lentas? não? o que eu não estou entendendo sobre o compilador de tempo de execução lá.
Master James

0

verifique se há nulo ou indefinido em todos os casos a_string

if (a_string && typeof a_string === 'string') {
    // this is a string and it is not null or undefined.
}

typeof nulle typeof undefinednunca voltará 'string', então typeof a_stringé o suficiente. Desculpe por necroposting
Ivan Frolov

-3

Minha abordagem pessoal, que parece funcionar para todos os casos, é testar a presença de membros que estarão presentes apenas para strings.

function isString(x) {
    return (typeof x == 'string' || typeof x == 'object' && x.toUpperCase && x.substr && x.charAt && x.trim && x.replace ? true : false);
}

Veja: http://jsfiddle.net/x75uy0o6/

Gostaria de saber se esse método tem falhas, mas me serviu bem por anos.


2
Isso é facilmente enganado por qualquer objeto antigo que possua esses métodos.
alex

8
Isso é chamado de digitação de pato - por exemplo, se ele anda como uma corda e fala como uma corda, também pode ser uma corda. Você é um pouco louco se acha que essa é a melhor maneira de testar uma string, mas o Javascript é um Thunderdome, você faz.
Jon z
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.