Come posso verificare se un var è una stringa in JavaScript?


Risposte:


381

Eri vicino:

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

In una nota correlata: il controllo sopra riportato non funzionerà se viene creata una stringa new String('hello')come sarà Objectinvece il tipo . Ci sono soluzioni complicate per aggirare questo problema, ma è meglio evitare di creare stringhe in quel modo, mai.


1
Ragazzi, darei davvero una risposta accettata a entrambi, ma non posso, tutto quello che posso fare è +1 ad entrambi, piuttosto che dare la risposta accettata a chi è più vicino al mio problema specifico, che non ho completamente spiegato.
vitto

questo ha funzionato per meif(typeof(str) === typeof(String()))
Scott Murphy,

78

L' typeofoperatore non è un infisso (quindi l'LHS del tuo esempio non ha senso).

Devi usarlo in questo modo ...

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

Ricorda, typeofè un operatore, non una funzione. Nonostante ciò, vedrai typeof(var)essere usato molto in natura. Questo ha tanto senso quanto var a = 4 + (1).

Inoltre, puoi anche usare ==(operatore di confronto di uguaglianza) poiché entrambi gli operandi sono Strings ( restituisce typeof sempre a String), JavaScript è definito per eseguire gli stessi passaggi che avevo usato ===(operatore di confronto rigoroso).

Come menziona Box9 , questo non rileverà un Stringoggetto istanziato .

Puoi rilevarlo con ....

var isString = str instanceof String;

jsFiddle .

...o...

var isString = str.constructor == String;

jsFiddle .

Ma questo non funzionerà in un windowambiente multiplo (pensa iframe).

Puoi aggirare questo con ...

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

jsFiddle .

Ma ancora, (come menziona Box9 ), stai meglio usando solo il Stringformato letterale , ad es var str = 'I am a string';.

Ulteriori letture .


1
@ Box9 Non preoccuparti, sono comunque responsabile: P
alex,

@alex Lo sono anche io: o (altri 10 minuti!)
David Tang,

3
@RobG Rep è limitato quando hai ottenuto il massimo rappresentante per un periodo di 24 ore. Successivamente, i voti non contano ai fini della tua reputazione.
alex

Non è possibile verificare se una variabile è una stringa semplicemente testando la presenza di un membro che hanno solo le stringhe? Ad esempio if(myVar.toUpperCase) alert('I am a string');:? Vedi: jsfiddle.net/tb3t4nsx
ingrediente_15939

1
@ ingrediente_15939 non è proprio un buon modo ... a causa di{ toUpperCase: '' }
alex

14

La combinazione delle risposte precedenti fornisce queste soluzioni:

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

o

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

4

L'espressione seguente restituisce true :

'qwe'.constructor === String

L'espressione seguente restituisce true :

typeof 'qwe' === 'string'

L'espressione seguente restituisce false (sic!):

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

L'espressione seguente restituisce true :

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

Modo migliore e giusto ( imho ):

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

1

Oggi credo che sia preferito usare una forma funzione di typeof () quindi ...

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

non esiste una forma di funzione typeof, stai solo controllando l'ordine delle operazioni con quelle parentesi. Alcune persone potrebbero trovarlo più leggibile in determinate circostanze.
Jon z

@Jonz Che cosa intendevi per "controllo dell'ordine delle operazioni"? Grazie.
a20

Penso che in seguito mi sono reso conto che puoi controllare il costruttore e preferirlo come in teoria pensavo sarebbe più veloce ma non è più veloce? L'esempio numero 4 mostra l'utilizzo delle parentesi developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… è sicuramente più leggibile e meno da considerare per un analizzatore di compilatore. La mia ipotesi sull'ordine è probabilmente un problema di velocità o correlato al modo in cui il compilatore carica lo stack di argomenti, non sono sicuro.
Master James,

1
@ a20 L'ordine delle operazioni descrive l'ordine in cui le operazioni vengono eseguite per le istruzioni che contengono più operazioni. Vedere developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… - le parentesi (raggruppamento operativo) hanno la massima precedenza da parte dell'operatore e vengono quindi valutate per prime. In questo caso, le parentesi intorno filenameraggruppano solo una singola istruzione e sono quindi inutili ed estranee. È una buona cosa che questa risposta abbia un punteggio di 0 perché è sbagliata, fuorviante e inutile; sarebbe meglio se avesse un punteggio negativo.
Jon z

Grazie molto istruttivo per il link. Quindi le parentesi vengono controllate ed eseguite per prime? così che dovrebbe scappare immediatamente senza cercare il prossimo per altri modi di chiamare aka senza parentesi, che sarebbero passi più tardi e più lenti? no? cosa non capisco sul compilatore di runtime lì.
Master James

0

controlla null o indefinito in tutti i casi a_string

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

typeof nulle typeof undefinednon tornerà mai più 'string', quindi typeof a_stringè abbastanza. Ci scusiamo per il necropostaggio
Ivan Frolov il

-3

Il mio approccio personale, che sembra funzionare in tutti i casi, sta testando la presenza di membri che saranno tutti presenti solo per le stringhe.

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

Vedi: http://jsfiddle.net/x75uy0o6/

Mi piacerebbe sapere se questo metodo ha dei difetti, ma mi ha servito bene per anni.


2
Questo è facilmente ingannato da qualsiasi vecchio oggetto che abbia questi metodi.
alex

8
Questo si chiama duck-typing - ad esempio se cammina come una stringa e parla come una stringa, potrebbe anche essere una stringa. Sei un po 'pazzo se pensi che questo sia il modo migliore per testare una stringa, ma Javascript è un Thunderdome.
Jon z
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.