Question Vérifier si une valeur est un objet en JavaScript


Comment vérifiez-vous si une valeur est un objet dans JavaScript?


844
2017-12-14 20:35


origine


Réponses:


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 de la variable, mais il est ne pas une recette à l'épreuve des balles (après tout, il n'y a pas de recette du tout!) pour vérifier si c'est un objet, loin de là. Puisque les gens ont tendance à chercher quelque chose à copier d'ici sans faire aucune recherche, je recommande fortement qu'ils se tournent vers l'autre, la réponse la plus mise à jour (et correcte!).


330
2017-12-14 20:39



Si typeof yourVariable === 'object', c'est un objet ou null. Si vous voulez exclure null, faites-le yourVariable !== null && typeof yourVariable === 'object'.


1015
2017-12-14 20:40



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

primitive, valeur primitive

Une donnée qui n'est pas un objet et ne possède aucune méthode. JavaScript a 5 types de données primitifs: string, number, boolean, null, indéfini.

Qu'est-ce qu'un primitif?

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

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

  • Object.prototype
  • tout est descendu 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: c'est ne pas  Cs prototype
      • new C() - "nouveau" -d'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) - wrappers autour des primitives
    • ... beaucoup d'autres choses ...
  • Object.create(null)
  • tout est descendu 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 de faux positifs (null) et faux négatifs (fonctions):

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

Object.prototype.toString.call ne fonctionnera pas, à cause de 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);
}

parce que, selon le MDN docs:

Le constructeur Object crée un wrapper d'objet pour la valeur donnée. Si la valeur est null ou indéfinie, il créera et retournera un objet vide, sinon il retournera un objet d'un type correspondant à la valeur donnée. Si la valeur est déjà un objet, elle renverra la valeur.


Une troisième façon qui semble fonctionner (pas sûr si c'est 100%) est d'utiliser Object.getPrototypeOf lequel jette 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({})

429
2018-03-18 14:44



L'officiel underscore.js utilise cette vérification pour savoir si quelque chose est vraiment un objet

// Is a given variable an object?
_.isObject = function(obj) {
  return obj === Object(obj);
};

173
2018-02-05 11:50



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

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

Pour plus d'informations à ce sujet et pourquoi c'est une bonne alternative à typeof, consultez cet article.


148
2017-11-13 06:20



J'aime simplement:

function isObject (item) {
  return (typeof item === "object" && !Array.isArray(item) && item !== null);
}

Si l'élément est un objet JS et qu'il ne s'agit pas d'un tableau JS, ce n'est pas null... si tous les trois se révèlent vrais, retournez true. Si l'une des trois conditions échoue, le && test sera court-circuit et false sera retourné. le null test peut être omis si désiré (en fonction de la façon dont vous utilisez null).

DOCS:

http://devdocs.io/javascript/operators/typeof

http://devdocs.io/javascript/global_objects/object

http://devdocs.io/javascript/global_objects/array/isarray

http://devdocs.io/javascript/global_objects/null


65
2017-09-07 22:49



Pour vérifier simplement par rapport à l'objet ou au tableau sans appel de fonction supplémentaire (vitesse). Comme aussi posté ici.

isArray ()

isArray = function(a) {
    return (!!a) && (a.constructor === Array);
};
console.log(isArray(        )); // false
console.log(isArray(    null)); // false
console.log(isArray(    true)); // false
console.log(isArray(       1)); // false
console.log(isArray(   'str')); // false
console.log(isArray(      {})); // false
console.log(isArray(new Date)); // false
console.log(isArray(      [])); // true

isObject () - Note: utilisez uniquement les littéraux Object, car il renvoie false pour les objets personnalisés, comme new Date ou new YourCustomObject.

isObject = function(a) {
    return (!!a) && (a.constructor === Object);
};
console.log(isObject(        )); // false
console.log(isObject(    null)); // false
console.log(isObject(    true)); // false
console.log(isObject(       1)); // false
console.log(isObject(   'str')); // false
console.log(isObject(      [])); // false
console.log(isObject(new Date)); // false
console.log(isObject(      {})); // true

61
2018-05-17 11:39