Vous pouvez utiliser l' typeof
opérateur:
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"
Exemple de cette page Web . (Cependant, l'exemple a été légèrement modifié).
Cela ne fonctionnera pas comme prévu dans le cas de chaînes créées avec new String()
, mais cela est rarement utilisé et recommandé contre [1] [2] . Consultez les autres réponses pour savoir comment les gérer, si vous le souhaitez.
- Le guide de style JavaScript de Google indique de ne jamais utiliser de wrappers d'objets primitifs .
- Douglas Crockford a recommandé que les wrappers d'objets primitifs soient déconseillés .
Pablo Santa Cruz
la source
new String('foo')
, mais cela n'a pas d'importance parce que les chaînes enveloppées sont une fonctionnalité sans valeur que vous ne devriez pas utiliser. Le guide de style de Google les interdit , Douglas Crockford les veut obsolètes et aucune bibliothèque ne les utilise. Imaginez qu'ils n'existent pas et utilisez-lestypeof
sans crainte.typeof
n'a-t-il pas recommandé que ce soit également obsolète ?C'est ce qui fonctionne pour moi:
la source
instanceof
vérification ici est un bruit inutile à moins que vous ne suiviez des pratiques de codage très inhabituelles , et cette réponse ne fait rien pour expliquer ce qu'elle fait ou pourquoi vous pourriez l'utiliser. La seule raison pour laquelle vous en auriez besoin est si vous utilisez des chaînes enveloppées d'objet, mais les chaînes enveloppées d'objet sont une fonctionnalité sans valeur que personne n'utilise et Google et Crockford condamnent tous les deux comme une mauvaise pratique ( google-styleguide.googlecode.com/svn/ trunk /… , crockford.com/javascript/recommend.html ).typeof
etinstanceof
se sent comme un bon conseil si votre code peut être appelé par d'autres. @ Lepostmessage
cas de bord de MarkAmery est important si vous demandez "qu'est-ce que j'étais justepostmessage
d?" - mais vous vous attendez à ce que cela soit géré à l'interface et non autorisé à se propager. Ailleurs, il semble correct de gérer des méthodes de codage non obsolètes même si certains esthètes JS les désapprouvent. Ne commentez JAMAIS votre code comme acceptant String, à moins qu'il ne le fasse vraiment!Étant donné que 580+ personnes ont voté pour une réponse incorrecte et 800+ ont voté pour une réponse qui fonctionne, mais comme un fusil de chasse, j'ai pensé qu'il pourrait être utile de refaire ma réponse sous une forme plus simple que tout le monde peut comprendre.
Ou, en ligne (j'ai une configuration UltiSnip pour cela):
Pour votre information, la réponse de Pablo Santa Cruz est faux, parce que
typeof new String("string")
estobject
La réponse de DRAX est précise et fonctionnelle, et devrait être la bonne réponse (puisque Pablo Santa Cruz est définitivement incorrect, et je ne contesterai pas le vote populaire.)
Cependant, cette réponse est également certainement correcte, et en fait la meilleure réponse (sauf, peut-être, pour la suggestion d'utiliser lodash / underscore ). mentions légales: J'ai contribué à la base de code lodash 4.
Ma réponse originale (qui a évidemment survolé de nombreuses têtes) suit:
J'ai transcodé ceci à partir de underscore.js:
Cela définira isString, isNumber, etc.
Dans Node.js, cela peut être implémenté en tant que module:
[edit]:
Object.prototype.toString.call(x)
fonctionne pour délimiter également les fonctions et les fonctions asynchrones:la source
global || window
place dewindow
mais ce serait une mauvaise approche pour résoudre un problème que vous ne devriez pas avoir en premier lieu).myObject+"" === myObject
si un objet est une chaîne (ou mieux encore, je ne taperais pas check dans un système de type basé sur le comportement en premier lieu).toString
dans leObject.prototype
. Donc, je dirais que s'appuyer surtoString
pour vérifier le type d'un objet est, au mieux, une mauvaise pratique.Je recommande d'utiliser les fonctions intégrées de jQuery ou lodash / Underscore . Ils sont plus simples à utiliser et plus lisibles.
L'une ou l'autre fonction gérera le cas mentionné par DRAX ... c'est-à-dire qu'ils vérifient tous les deux si (A) la variable est un littéral de chaîne ou (B) c'est une instance de l'objet String. Dans les deux cas, ces fonctions identifient correctement la valeur comme étant une chaîne.
lodash / Underscore.js
jQuery
Voir la documentation lodash pour _.isString () pour plus de détails.
Voir la documentation jQuery pour $ .type () pour plus de détails.
la source
_.every()
est un peu déroutant à utiliser au début, et quelque chose d'aussi simple que les développeurs_.isBoolean()
confus dans mon entreprise. Un développeur a pensé à tort que ce serait faux si la valeur était un booléen et était fausse. L'anglais est plus facile à lire que l'allemand pour moi, car je ne connais pas l'allemand. Apprenez JavaScript et tout cela aura du sens.Je l'ai vu ici:
http://perfectionkills.com/instanceof-considered-harmful-or-how-to-write-a-robust-isarray/
la source
Object.prototype.toString.call(obj) === '[object String]'
?(x === y)
que sa lisibilité est meilleurex === y
?Meilleur moyen:
Chacun d'eux a été construit par sa fonction de classe appropriée, comme "new Object ()" etc.
En outre, Duck-Typing: "S'il ressemble à un canard, marche comme un canard et sent comme un canard - ce doit être un tableau". Signification, vérifiez ses propriétés.
J'espère que cela t'aides.
Éditer; 12/05/2016
N'oubliez pas que vous pouvez également toujours utiliser des combinaisons d'approches. Voici un exemple d'utilisation d'une carte d'actions en ligne avec typeof :
Voici un exemple plus «réel» d'utilisation de cartes en ligne:
Cette fonction utiliserait le "type-casting" [personnalisé] - plutôt "type - / - value-mapping" - pour déterminer si une variable "existe" réellement. Maintenant, vous pouvez diviser ces cheveux désagréables entre
null
&0
!Plusieurs fois, vous ne vous souciez même pas de son type . Une autre façon de contourner la frappe consiste à combiner des ensembles de type canard:
Les deux
Number.prototype
etString.prototype
ont un.toString() method
. Vous venez de vous assurer que l'équivalent chaîne du nombre était le même, puis vous vous êtes assuré que vous l'avez passé dans lahttp
fonction en tant queNumber
. En d' autres termes, on n'a même pas soin ce que son type était.J'espère que cela vous donne plus de travail :)
la source
(o.constructor === Number || s.constructor === Boolean)
). Anecdotique,parseInt
etNaN
sont des outils fragiles mais puissants. N'oubliez pas que Not-a-Number n'est PAS Not-a-Number et qu'undefined peut être défini.if(thing.call) { 'its a function'; }
ouif(thing.defineProperties) { 'its an object'; }
. Merci pour la contribution, axkibe!Honnêtement, je ne vois pas pourquoi on n'utiliserait pas simplement
typeof
dans ce cas:Oui, il échouera contre les chaînes enveloppées d'objets (par exemple
new String('foo')
), mais celles-ci sont largement considérées comme une mauvaise pratique et la plupart des outils de développement modernes sont susceptibles de décourager leur utilisation. (Si vous en voyez un, réparez-le!)L'
Object.prototype.toString
astuce est quelque chose que tous les développeurs frontaux ont été reconnus coupables d'avoir fait un jour dans leur carrière, mais ne vous laissez pas tromper par son raffinement intelligent: il se cassera dès que quelque chose de singulier corrigera le prototype Object:la source
J'aime utiliser cette solution simple:
la source
undefined
etnull
, et de toujours obtenir la bonne réponse pour les chaînes vides (les deux''
etnew String('')
).(mystring || false) && mystring.constructor === String
. J'ai utilisé false au cas où il serait utilisé dans une fonction qui doit renvoyer un booléen.Ceci est un excellent exemple de l'importance des performances:
Faire quelque chose d'aussi simple qu'un test pour une chaîne peut être coûteux s'il n'est pas fait correctement.
Par exemple, si je voulais écrire une fonction pour tester si quelque chose est une chaîne, je pourrais le faire de deux manières:
1)
const isString = str => (Object.prototype.toString.call(str) === '[object String]');
2)
const isString = str => ((typeof str === 'string') || (str instanceof String));
Ces deux éléments sont assez simples, alors qu'est-ce qui pourrait avoir un impact sur les performances? De manière générale, les appels de fonction peuvent être coûteux, surtout si vous ne savez pas ce qui se passe à l'intérieur. Dans le premier exemple, il existe un appel de fonction à la méthode toString d'Object. Dans le deuxième exemple, il n'y a pas d'appels de fonction, car typeof et instanceof sont des opérateurs. Les opérateurs sont beaucoup plus rapides que les appels de fonction.
Lorsque les performances sont testées, l'exemple 1 est 79% plus lent que l'exemple 2!
Voir les tests: https://jsperf.com/isstringtype
la source
typeof str === 'string' || str instanceof String
(peut laisser tomber la parenthèse que je préfère dans lesif (..)
cas); indépendamment, la vérification à la fois des types primitifs et des objets dans # 2 est claire et suffisante. Ces vérifications devraient de toute façon être «rares».Fonctionne pour les littéraux de chaîne
let s = 'blah'
et pour les chaînes d'objetslet s = new String('blah')
la source
Extrait de lodash:
la source
Je pense que la solution @customcommander devrait suffire dans 90% de vos cas:
Devrait vous servir correctement (simplement parce que normalement il n'y a aucune raison d'avoir
new String('something')
dans votre code).Si vous souhaitez gérer le
String
objet (par exemple, vous vous attendez à une var d'un tiers), alors utiliser lodash comme @ ClearCloud8 suggéré semble être une solution claire, simple et élégante.Je suggérerais cependant d'être prudent avec les bibliothèques telles que lodash en raison de leur taille. Au lieu de faire
Ce qui apporte tout l'énorme objet lodash, je suggère quelque chose comme:
Et avec un regroupement simple, ça devrait aller (je me réfère ici au code client).
la source
Si vous travaillez sur l'environnement node.js, vous pouvez simplement utiliser la fonction intégrée isString dans les utilitaires.
Edit: comme @Jehy l'a mentionné, cela est obsolète depuis la v4.
la source
typeof value === 'string'
place".x = new String('x'); x.isString(x);
renvoie faux . Il y autil.types.isStringObject()
mais cela renvoie false pour lex = 'x'
type chaîne. Deux fonctions utilitaires qui ne fournissent absolument aucune utilité ...La méthode suivante vérifie si une variable est une chaîne ( y compris les variables qui n'existent pas ).
la source
J'ai également trouvé que cela fonctionne bien aussi, et c'est beaucoup plus court que les autres exemples.
En concaténant sur des guillemets vides, il transforme la valeur en chaîne. Si
myVar
est déjà une chaîne, l'instruction if réussit.la source
typeof
.typeof
mais encore un peu plus rapide quetoString
. Quoi qu'il en soit, je suppose que j'aime juste la syntaxe de la contrainte.var s = new String('abc'); > s === s + '' > false
new String
cus qui crée un type deobject
. w3schools.com/js/tryit.asp?filename=tryjs_string_object2la source
false
.Je trouve cette technique simple utile pour effectuer une vérification de type pour String -
La même technique fonctionne aussi pour Number -
Et pour RegExp -
Idem pour l' objet -
NB, les regexps, les tableaux et les fonctions sont également considérés comme des objets.
Mais, vérifier Array est un peu différent -
Cette technique ne fonctionne cependant pas pour les fonctions -
la source
var x = new String(x); String(x)===x
renvoie faux. mais({}).toString.call(x).search(/String/)>0
revient toujours pour les choses filandreusesfunction isClass(x,re){return ({}).toString.call(x).search(re)>0;};
isClass("hello",/String/)
ouisClass(3,/Number/)
ouisClass(null,/Null/)
Une solution simple serait:
la source
toString()
fonction.toString
aucune valeur; essayez si le x à vérifier est nul ou non défini, votre exception detoString()
méthode peut être remplacée et peut lever une exception (en raison d'une implémentation spécifique), et votre vérification ne fonctionnera pas avec certitude. L'idée principale est que vous ne devez pas appeler des méthodes qui ne sont pas liées à ce que vous souhaitez obtenir. Je ne parle même pas de frais généraux inutiles liés à latoString
méthode. Downvoting.Un assistant Typechecker:
usage:
Aussi, si vous voulez qu'il soit récursif (comme Array qui est un objet), vous pouvez l'utiliser
instanceof
.(
['cs'] instanceof Object //true
)la source
Je vais suivre un chemin différent vers le reste ici, qui essaie de dire si une variable est un type spécifique, ou un membre d'un ensemble spécifique, de types.
JS est construit sur ducktyping; si quelque chose craque comme une chaîne, nous pouvons et devons l'utiliser comme une chaîne.
Est-ce
7
une chaîne? Alors pourquoi ça/\d/.test(7)
marche?Est-ce
{toString:()=>('hello there')}
une chaîne? Alors pourquoi ça({toString:()=>('hello there')}) + '\ngeneral kenobi!'
marche?Ce ne sont pas des questions sur doit - le travail ci - dessus, le point est qu'ils font.
J'ai donc fait une
duckyString()
fonctionci-dessous, je teste de nombreux cas non pris en charge par d'autres réponses. Pour chacun le code:
duckyString()
de normaliser les entrées pour le code qui attend de vraies chaînesC'est dans la même veine que
!!x
par opposition àx===true
et tester si quelque chose ressemble à un tableau au lieu de nécessiter un tableau réel.objets jQuery; sont-ils des tableaux? Non. Sont-ils assez bons? Oui, vous pouvez très bien les exécuter grâce à des
Array.prototype
fonctions.C'est cette flexibilité qui donne à JS sa puissance, et le test des chaînes rend spécifiquement votre code moins interopérable.
La sortie de ce qui précède est:
Il s'agit donc de savoir pourquoi vous voulez savoir si quelque chose est une chaîne.
Si, comme moi, vous êtes arrivé ici de Google et que vous vouliez voir si quelque chose ressemblait à une chaîne , voici une réponse.
Ce n'est même pas cher, sauf si vous travaillez avec des tableaux de caractères très longs ou profondément imbriqués.
C'est parce que ce sont toutes des instructions if, aucune fonction ne s'appelle like
.toString()
.Sauf si vous essayez de voir si un tableau de caractères avec des objets qui n'ont que des caractères
toString()
's ou multi-octets, auquel cas il n'y a pas d'autre moyen de vérifier que de créer la chaîne et de compter les caractères que les octets constituent respectivementSont incluses des options pour
.toString()
)Voici plus de tests car je suis complétiste:
Production:
la source
Juste pour développer la réponse de @ DRAX , je ferais ceci:
Il prendra également en compte les
null
s et lesundefined
types, et il prendra en charge les types non-chaîne, tels que0
.la source
C'est assez bon pour moi.
AVERTISSEMENT: ce n'est pas une solution parfaite. Voir le bas de mon post.
Et vous pouvez utiliser ceci comme ci-dessous.
AVERTISSEMENT: cela ne fonctionne pas correctement dans le cas:
la source
Vous pouvez utiliser cette fonction pour déterminer le type de n'importe quoi:
Pour vérifier si une variable est une chaîne:
https://codepen.io/patodiblasi/pen/NQXPwY?editors=0012
la source
Je ne sais pas si vous voulez savoir s'il s'agit d'un type
string
quel que soit son contenu, ou si son contenu est un nombre ou une chaîne, quel que soit son type.Donc, pour savoir si son type est une chaîne, cela a déjà été répondu.
Mais pour savoir en fonction de son contenu si c'est une chaîne ou un nombre, j'utiliserais ceci:
Et pour quelques exemples:
la source
/^\d+$/.test('123')
pour éviter les subtilités des problèmes potentiels d'analyse)