291 votes

Meilleure façon d'obtenir le type d'une variable Javascript?

Est-il une meilleure façon d'obtenir le type d'une variable en JS qu' typeof? Cela fonctionne bien lorsque vous n':

> typeof 1
"number"
> typeof "hello"
"string"

Mais il est inutile lorsque vous essayez de:

> typeof [1,2]
"object"
>r = new RegExp(/./)
/./
> typeof r
"function"

Je ne connais instanceof, mais cela nécessite de connaître le type à l'avance.

> [1,2] instanceof Array
true
> r instanceof RegExp
true

Est-il un meilleur moyen?

250voto

ipr101 Points 15337

Angus Croll a récemment écrit un intéressant billet de blog à ce sujet -

http://javascriptweblog.wordpress.com/2011/08/08/fixing-the-javascript-typeof-operator/

Il passe en revue les avantages et les inconvénients des différentes méthodes définit ensuite une nouvelle méthode 'toType' -

var toType = function(obj) {
  return ({}).toString.call(obj).match(/\s([a-zA-Z]+)/)[1].toLowerCase()
}

60voto

Alex Turpin Points 17272

Vous pouvez essayer d'utiliser constructor.name.

[].constructor.name
new RegExp().constructor.name

Comme tout le JavaScript, quelqu'un finira invariablement point que c'est en quelque sorte le mal, donc voici un lien vers une réponse qui couvre ce assez bien.

Une alternative est d'utiliser Object.prototype.toString.call

Object.prototype.toString.call([])
Object.prototype.toString.call(/./)

42voto

Nick Husher Points 1216

Un bon type de la fonction de capture est celui utilisé par YUI3:

var TYPES = {
    'undefined'        : 'undefined',
    'number'           : 'number',
    'boolean'          : 'boolean',
    'string'           : 'string',
    '[object Function]': 'function',
    '[object RegExp]'  : 'regexp',
    '[object Array]'   : 'array',
    '[object Date]'    : 'date',
    '[object Error]'   : 'error'
},
TOSTRING = Object.prototype.toString;

function type(o) {
    return TYPES[typeof o] || TYPES[TOSTRING.call(o)] || (o ? 'object' : 'null');
};

Cette capture de nombreux les primitives fournies par le javascript, mais vous pouvez toujours ajouter d'autres en modifiant l' TYPES objet. Notez que typeof HTMLElementCollection dans Safari rapport function, mais de type(HTMLElementCollection) sera de retour object

16voto

greymaster Points 61

Aussi, nous pouvons changer un peu l'exemple de ipr101

Object.prototype.toType = function() {
  return ({}).toString.call(this).match(/\s([a-zA-Z]+)/)[1].toLowerCase()
}

et d'appeler en tant

"aaa".toType(); // 'string'

10voto

Yukulélé Points 825

une ligne de la fonction :

function type(val){
    return Object.prototype.toString.call(val).replace(/^\[object (.+)\]$/,"$1").toLowerCase();
}

cela donne le même résultat que jQuery.type()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X