Existe-t-il un meilleur moyen d'obtenir le type d'une variable dans JS que typeof
? Cela fonctionne bien lorsque vous faites:
> typeof 1
"number"
> typeof "hello"
"string"
Mais c'est inutile quand vous essayez:
> typeof [1,2]
"object"
>r = new RegExp(/./)
/./
> typeof r
"function"
Je connais instanceof
, mais cela vous oblige à connaître le type au préalable.
> [1,2] instanceof Array
true
> r instanceof RegExp
true
Y a-t-il une meilleure façon?
javascript
types
typeof
Aillyn
la source
la source
typeof new RegExp(/./); // "function"
problème dans Chrome semble être résolu dans Chrome 14.n
lieu du nom d'origine attendu. par exemple,constructor.name
pourrait vous donnern
au lieu du nom complet attenduRéponses:
Angus Croll a récemment écrit un article de blog intéressant à ce sujet -
http://javascriptweblog.wordpress.com/2011/08/08/fixing-the-javascript-typeof-operator/
Il passe par le pour et le contre des différentes méthodes puis définit une nouvelle méthode 'toType' -
la source
ActiveXObject
instances d' Internet Explorer , par exemple.match(/\s([a-z,_,:,A-Z]+)/)
Uint8Array
. Au lieu de cela, considérez le plus généralmatch(/\s([^\]]+)/)
qui devrait gérer n'importe quoi.\w
mot opérateur à la place…Vous pouvez essayer d'utiliser
constructor.name
.Comme avec tout JavaScript, quelqu'un finira par indiquer invariablement que c'est en quelque sorte mauvais, alors voici un lien vers une réponse qui couvre assez bien cela.
Une alternative est d'utiliser
Object.prototype.toString.call
la source
name
est une extension d'ECMAScript et ne fonctionnera pas dans tous les navigateurs.constructor.name
peut probablement ressembler à lan
place du nom d'objet que vous attendez. Alors faites attention à cela - surtout si vous ne faites que minifier en production.null
etundefined
malheureusement, je n'ai pas de constructeur.Une fonction de capture de type raisonnablement bonne est celle utilisée par YUI3 :
Cela capture de nombreuses primitives fournies par javascript, mais vous pouvez toujours en ajouter d'autres en modifiant l'
TYPES
objet. Notez quetypeof HTMLElementCollection
dans Safari signalerafunction
, mais tapez (HTMLElementCollection) retourneraobject
la source
Vous pouvez trouver la fonction suivante utile:
Ou dans ES7 (commentez si d'autres améliorations)
Résultats:
Merci @johnrees de m'avoir informé de: erreur, promesse, fonction de générateur
la source
typeOf(new Date())
typeOf(Promise.resolve())//promise
typeOf(function *() {})//generatorfunction
[ts] Cannot redeclare block-scoped variable 'toString'
Nous pouvons également changer un petit exemple de ipr101
et appeler comme
la source
une fonction de ligne:
cela donne le même résultat que
jQuery.type()
la source
Vous pouvez appliquer
Object.prototype.toString
à n'importe quel objet:Cela fonctionne bien dans tous les navigateurs, à l'exception d'IE - lorsque vous appelez cela sur une variable obtenue à partir d'une autre fenêtre, cela crache
[object Object]
.la source
Mon 2 ¢! Vraiment, une partie de la raison pour laquelle je lance ceci ici, malgré la longue liste de réponses, est de fournir un peu plus
all in one
solution de type et d'obtenir des informations à l'avenir sur la façon de l'étendre pour en inclure davantagereal types
.Avec la solution suivante, comme mentionné ci-dessus, j'ai combiné quelques solutions trouvées ici, ainsi que l'incorporation d'un correctif pour renvoyer une valeur de l' jQueryobjet défini sur jQuery si disponible . J'ajoute également la méthode au prototype d'objet natif. Je sais que c'est souvent tabou, car cela pourrait interférer avec d'autres extensions de ce type, mais je laisse cela à
user beware
. Si vous n'aimez pas cette façon de faire, copiez simplement la fonction de base où vous voulez et remplacez toutes les variables dethis
par un paramètre d'argument à passer (comme les arguments [0]).Ensuite, utilisez simplement avec facilité, comme ceci:
Plus d'exemples:
Si vous avez quelque chose à ajouter qui peut être utile, comme définir quand un objet a été créé avec une autre bibliothèque (Moo, Proto, Yui, Dojo, etc ...), n'hésitez pas à commenter ou à modifier cela et à le garder plus précis et précis. OU passez à la GitHubje l' ai fait et faites le moi savoir. Vous y trouverez également un lien rapide vers un fichier cdn min.
la source
Dans mes tests préliminaires, cela fonctionne plutôt bien. Le premier cas affichera le nom de tout objet créé avec "nouveau", et le deuxième cas devrait attraper tout le reste.
J'utilise
(8, -1)
parce que je suppose que le résultat va toujours commencer[object
et se terminer,]
mais je ne suis pas certain que ce soit vrai dans tous les scénarios.la source
Je suppose que la solution la plus universelle ici - est de vérifier
undefined
et d'null
abord, puis d'appelerconstructor.name.toLowerCase()
.la source
.constructor.name
contient toujours la valeur de la chaîne. Pour undefined / null, nous avons les chaînes appropriées retournées par la fonction.constructor
s'agit d'une propriété héritée, cela interrompt les objets créés avecObject.create(null)
. Assez simple à réparer, mais comment l'appeler? "[objet nul]"?typeof
condition est utilisée pour vérifier le type de variable, si vous contrôlez le type de variable dans la condition if-else, par exemplela source