1976 votes

Vérifier si une valeur est un objet en JavaScript

Comment vérifier si une valeur est un objet en JavaScript ?

4 votes

Une variable est une variable. Elle peut faire référence à un objet. De plus, vous voudrez peut-être définir le terme "objet" - comme le montrent les réponses et les commentaires, il existe plusieurs définitions contradictoires (par exemple, le fait de savoir si null est un objet).

8 votes

OP, IMO vous devriez accepter la réponse de @Daan car c'est la meilleure solution et elle devrait être listée au-dessus des autres réponses pour être vue en premier. (Sans vouloir offenser les autres qui ont aussi de bonnes réponses).

3 votes

IMHO, cela dépend vraiment de ce que vous (celui qui cherche une réponse à cette question) considérez comme un objet, et pourquoi vous le vérifiez. Cette question donne des réponses différentes si vous essayez de distinguer les Arrays (que les sont Objets) de autre Objets ou si vous essayez de séparer les valeurs scalaires des "vecteurs". Et si null (que est un Objet, selon le typeof) ou des Fonctions (qui sont Objets) doit être exclu ou non, cela dépend vraiment de la raison pour laquelle vous le vérifiez. C'est pourquoi il y a tant de réponses et la plupart d'entre elles, dans leur contexte, sont correctes.

2232voto

Chuck Points 138930

Si typeof yourVariable === 'object' c'est un objet ou null. Si vous voulez exclure null, il suffit de le rendre typeof yourVariable === 'object' && yourVariable !== null .

0 votes

@RightSaidFred : Eh bien, comme l'a dit Delnan, je suppose que c'est une question de définitions. En fait, je serais enclin à dire que null est un objet en me basant sur les dires de l'opérateur typeof. Mais je suppose que vous avez raison de dire que ce n'est pas la définition la plus utile. C'est juste mon modèle mental personnel du langage, où "is-object" et "is-null" sont deux drapeaux distincts.

1 votes

Ouais, je ne suis pas sûr de ce que Delnan voulait dire par là, mais ECMAScript 5 définit la valeur nulle comme "Valeur primitive qui représente l'absence intentionnelle de toute valeur d'objet." malgré le fait que son typeof opérateur prétend autrement . Je ne suis pas sûr de la formulation de l'ES3. C'est à fixer dans ES6. Dans tous les cas, null ne se comporte en aucun cas comme un objet. Votre yourVariable != null est l'approche commune jusqu'à +1.

0 votes

@RightSaidFred : Wow, ES3 est d'accord. J'ai toujours fait confiance à l'opérateur typeof et je me suis dit que c'était un artefact de l'influence de Java sur le système objet. J'avais clairement tort.

899voto

UPDATE :

Cette réponse est incomplète et donne des résultats trompeurs. . Par exemple, null est également considéré comme de type object en JavaScript, sans parler de plusieurs autres cas limites. Suivez la recommandation ci-dessous et passez à d'autres "la réponse la plus votée (et la plus correcte !)" :

typeof yourVariable === 'object' && yourVariable !== null

Réponse originale :

Essayez d'utiliser typeof(var) et/ou var instanceof something .

EDIT : Cette réponse donne une idée de la façon d'examiner les propriétés d'une variable, mais c'est pas une recette infaillible (après tout, il n'y a pas de recette du tout !) pour vérifier s'il s'agit d'un objet, loin de là. Comme les gens ont tendance à chercher quelque chose à copier ici sans faire de recherche, je leur recommande vivement de se tourner vers l'autre réponse, la plus votée (et la plus correcte !).

0 votes

@MichaelKrelin-hacker : Je ferai de mon mieux. ;) Mais qu'en est-il myvar instanceof(something) ou (myvar)instanceof(something) ? ;)

0 votes

@MichaelKrelin-hacker : Pour moi, c'est clair... typeof x avec des paranthèses ressemble à une fonction, mais instanceof ne le fait pas, peu importe ce que vous faites. Aucune idée pourquoi typeof n'est pas une fonction (je ne connais pas assez le JS pour décider si cela pourrait l'être).

0 votes

@maaartinus, ça pourrait comme vous pouvez avoir function fntypeof(x){return typeof x} . De plus, vous pouvez avoir function fninstanceof(x,y){return x instanceof y} . La raison pour laquelle il s'agit d'un opérateur est probablement due au fait qu'il est modelé sur le c sizeof qui se produit au moment de la compilation. Et la principale raison d'utiliser des parenthèses étendues dans le code pour moi est que je ne me souviens pas toujours de la préséance ;)

618voto

Matt Fenwick Points 17097

Définissons le terme "objet" en Javascript . Selon le Documents MDN chaque valeur est soit un objet, soit une primitive :

primitif, valeur primitive

Une donnée qui n'est pas un objet et qui n'a pas de méthodes. JavaScript possède 5 types de données primitives : string, number, boolean, null, undefined.

Qu'est-ce qu'un primitif ?

  • 3
  • 'abc'
  • true
  • null
  • undefined

Qu'est-ce qu'un objet (c'est-à-dire pas une primitive) ?

  • Object.prototype
  • tout ce qui descend de Object.prototype
    • Function.prototype
      • Object
      • Function
      • function C(){} -- fonctions définies par l'utilisateur
    • C.prototype -- la propriété prototype d'une fonction définie par l'utilisateur : il s'agit de pas C s prototype
      • new C() -- "new"-ing une fonction définie par l'utilisateur
    • Math
    • Array.prototype
      • tableaux
    • {"a": 1, "b": 2} -- objets créés à l'aide de la notation littérale
    • new Number(3) -- enveloppes autour des primitives
    • ... beaucoup d'autres choses ...
  • Object.create(null)
  • tout descend d'un Object.create(null)

Comment vérifier si une valeur est un objet

instanceof par lui-même ne fonctionnera pas, car il manque deux cas :

// oops:  isObject(Object.prototype) -> false
// oops:  isObject(Object.create(null)) -> false
function isObject(val) {
    return val instanceof Object; 
}

typeof x === 'object' ne fonctionnera pas, à cause des faux positifs ( null ) et les faux négatifs (fonctions) :

// oops: isObject(Object) -> false
function isObject(val) {
    return (typeof val === 'object');
}

Object.prototype.toString.call ne fonctionnera pas, à cause des faux positifs pour toutes les primitives :

> Object.prototype.toString.call(3)
"[object Number]"

> Object.prototype.toString.call(new Number(3))
"[object Number]"

Donc j'utilise :

function isObject(val) {
    if (val === null) { return false;}
    return ( (typeof val === 'function') || (typeof val === 'object') );
}

La réponse de @Daan semble également fonctionner :

function isObject(obj) {
  return obj === Object(obj);
}

car, selon le Documents MDN :

Le constructeur Object crée un objet enveloppant pour la valeur donnée. Si la valeur est nulle ou indéfinie, il créera et retournera un objet vide, sinon, il retournera un objet d'un type qui correspond à la valeur donnée. Si la valeur est déjà un objet, il retournera la valeur.


Une troisième méthode qui semble fonctionner (je ne suis pas sûr que ce soit à 100%) est d'utiliser Object.getPrototypeOf dont lance une exception si son argument n'est pas un objet :

// these 5 examples throw exceptions
Object.getPrototypeOf(null)
Object.getPrototypeOf(undefined)
Object.getPrototypeOf(3)
Object.getPrototypeOf('abc')
Object.getPrototypeOf(true)

// these 5 examples don't throw exceptions
Object.getPrototypeOf(Object)
Object.getPrototypeOf(Object.prototype)
Object.getPrototypeOf(Object.create(null))
Object.getPrototypeOf([])
Object.getPrototypeOf({})

0 votes

Vérification de la note si typeof est "objet" ou "fonction" peut ne pas fonctionner avec les objets hôtes, qui sont autorisés à retourner d'autres choses, par exemple, dans IE, les objets ActiveX ont l'habitude de retourner "inconnu".

43 votes

obj === Object(obj) renvoie à true pour les tableaux.

6 votes

var x = []; console.log(x === Object(x)); // return true

355voto

Daan Points 695

underscore.js fournit la méthode suivante pour savoir si quelque chose est vraiment un objet :

_.isObject = function(obj) {
  return obj === Object(obj);
};

UPDATE

En raison d'un bogue antérieur dans V8 et d'une optimisation mineure de la vitesse micro, la méthode se présente comme suit depuis underscore.js 1.7.0 (août 2014) :

_.isObject = function(obj) {
  var type = typeof obj;
  return type === 'function' || type === 'object' && !!obj;
};

69 votes

En javascript un tableau est aussi un objet, donc la plupart du temps vous voulez exclure le tableau : return obj === Object(obj) && Object.prototype.toString.call(obj) !== '[object Array]'

28 votes

Pourquoi exclure un tableau ? Ce sont des objets à part entière.

86 votes

Parce que la plupart du temps, on veut distinguer un {} d'un [], par exemple en entrée d'une fonction

220voto

Christophe Points 7878

Object.prototype.toString.call(myVar) reviendra :

  • "[object Object]" si maVar est un objet
  • "[object Array]" si maVar est un tableau
  • etc.

Pour plus d'informations à ce sujet et pour savoir pourquoi il s'agit d'une bonne alternative à typeof, consultez cet article .

18 votes

J'ai appris récemment que typeof [] === 'object' --> true . C'est pour cela que vous avez besoin de cette méthode.

5 votes

@Christophe Ne fait pas de distinction entre les primitifs et les objets . Object.prototype.toString.call(3) -> "[object Number]" . Object.prototype.toString.call(new Number(3)) -> "[object Number] "

8 votes

Je ne pense pas que ce soit le genre d'"objet" que le PO essaie d'identifier.

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