Comment puis-je vérifier si une var est une chaîne en JavaScript?

183

Comment puis-je vérifier si une var est une chaîne en JavaScript?

J'ai essayé ça et ça ne marche pas ...

var a_string = "Hello, I'm a string.";

if (a_string typeof 'string') {
    // this is a string
}
vitto
la source

Réponses:

394

Vous étiez proche:

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

Sur une note connexe: la vérification ci-dessus ne fonctionnera pas si une chaîne est créée avec new String('hello')comme le type sera à la Objectplace. Il existe des solutions compliquées pour contourner ce problème, mais il vaut mieux éviter de créer des chaînes de cette façon, jamais.

David Tang
la source
1
Les gars, je donnerais vraiment une réponse acceptée à vous deux, mais je ne peux pas, tout ce que je peux faire est +1 aux deux, que de donner la réponse acceptée à qui est le plus proche de mon problème spécifique, que je ne l'ai pas entièrement expliqué.
vitto le
cela a fonctionné pour moiif(typeof(str) === typeof(String()))
Scott Murphy
80

L' typeofopérateur n'est pas un infixe (donc la LHS de votre exemple n'a pas de sens).

Vous devez l'utiliser comme ça ...

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

Souvenez-vous, typeofc'est un opérateur, pas une fonction. Malgré cela, vous verrez typeof(var)être beaucoup utilisé dans la nature. Cela a autant de sens que var a = 4 + (1).

Aussi, vous pouvez également utiliser ==(opérateur de comparaison d'égalité) puisque les deux opérandes sont Strings ( retourne typeof toujours a String), JavaScript est défini pour effectuer les mêmes étapes que j'avais utilisé ===(opérateur de comparaison stricte).

Comme le mentionne Box9 , cela ne détectera pas un Stringobjet instancié .

Vous pouvez détecter cela avec ...

var isString = str instanceof String;

jsFiddle .

...ou...

var isString = str.constructor == String;

jsFiddle .

Mais cela ne fonctionnera pas dans un windowenvironnement multi (pensez iframes).

Vous pouvez contourner cela avec ...

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

jsFiddle .

Mais encore une fois, (comme le mentionne Box9 ), il vaut mieux utiliser simplement le Stringformat littéral , par exemple var str = 'I am a string';.

Lectures complémentaires .

Alex
la source
1
@ Box9 Pas de soucis, je suis de toute façon plafonné: P
alex
@alex je le suis maintenant aussi: o (10 minutes de plus!)
David Tang
3
@RobG Rep plafonné est lorsque vous avez gagné le représentant maximum pour une période de 24 heures. Après cela, les votes positifs ne comptent pas pour votre réputation.
alex le
N'est-il pas possible de vérifier si une variable est une chaîne en testant simplement la présence d'un membre que seules les chaînes ont? Par exemple if(myVar.toUpperCase) alert('I am a string');:? Voir: jsfiddle.net/tb3t4nsx
ingrédient_15939
1
@ ingrédient_15939 ce n'est pas vraiment un bon moyen ... à cause de{ toUpperCase: '' }
alex
15

La combinaison des réponses précédentes fournit ces solutions:

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

ou

Object.prototype.toString.call(str) == '[object String]'
Alf Eaton
la source
4

L'expression suivante renvoie true :

'qwe'.constructor === String

L'expression suivante renvoie true :

typeof 'qwe' === 'string'

L'expression suivante renvoie false (sic!):

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

L'expression suivante renvoie true :

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

Meilleure et bonne manière (à mon humble avis ):

if (someVariable.constructor === String) {
   ...
}
redisko
la source
1

Aujourd'hui, je pense qu'il est préférable d'utiliser une forme de fonction de typeof (), donc ...

if(filename === undefined || typeof(filename) !== "string" || filename === "") {
   console.log("no filename aborted.");
   return;
}
Maître James
la source
il n'y a pas de forme de fonction typeof, vous contrôlez simplement l'ordre des opérations avec ces parenthèses. Certaines personnes peuvent le trouver plus lisible dans certaines circonstances.
Jon z
@Jonz Qu'entendez-vous par «ordre de contrôle des opérations»? Merci.
a20
Je pense que plus tard, j'ai réalisé que vous pouvez vérifier le constructeur et le préférer car en théorie, je pensais que ce serait plus rapide mais ce n'est pas plus rapide? L'exemple numéro 4 montre ici l'utilisation des parenthèses developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ ... c'est définitivement plus lisible et moins pour une analyse par compilateur. Ma conjecture sur «l'ordre» est peut-être un problème de vitesse ou lié à la façon dont le compilateur charge la pile d'arguments, je ne suis pas sûr.
Master James
1
@ a20 order of operations décrit l'ordre dans lequel les opérations sont exécutées pour les instructions contenant plusieurs opérations. Voir developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… - les parenthèses (regroupement d'exploitation) ont la priorité d'opérateur la plus élevée et sont donc évaluées en premier. Dans ce cas, les parenthèses autour filenamene regroupent qu'une seule instruction, et sont donc inutiles et superflues. C'est une bonne chose que cette réponse ait un score de 0 car elle est erronée, trompeuse et inutile; ce serait mieux s'il avait un score négatif.
Jon z
Merci très informatif pour le lien. Donc, les parenthèses sont vérifiées et exécutées en premier? de sorte que cela devrait fonctionner tout de suite sans vérifier ensuite les autres façons d'appeler aka sans parenthèses, qui seraient des étapes plus tard et plus lentes? non? ce que je ne comprends pas sur le compilateur d'exécution là-bas.
Master James
0

vérifier null ou indéfini dans tous les cas a_string

if (a_string && typeof a_string === 'string') {
    // this is a string and it is not null or undefined.
}
Kurkula
la source
typeof nullet typeof undefinedne reviendra jamais 'string', typeof a_stringc'est assez. Désolé pour le nécropostage
Ivan Frolov
-3

Mon approche personnelle, qui semble fonctionner pour tous les cas, consiste à tester la présence de membres qui ne seront tous présents que pour les chaînes.

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

Voir: http://jsfiddle.net/x75uy0o6/

J'aimerais savoir si cette méthode a des défauts, mais elle m'a bien servi pendant des années.

ingrédient_15939
la source
2
Ceci est facilement trompé par n'importe quel ancien objet qui a ces méthodes.
alex
8
Cela s'appelle le typage canard - par exemple, s'il marche comme une chaîne et qu'il parle comme une chaîne, cela pourrait aussi bien être une chaîne. Vous êtes un peu fou si vous pensez que c'est la meilleure façon de tester une chaîne, mais Javascript est un Thunderdome, c'est vous.
Jon z