web-dev-qa-db-fra.com

Comment déterminer si un objet a une propriété donnée en JavaScript

Comment déterminer si un objet x a une propriété définie y, quelle que soit la valeur de x.y?

J'utilise actuellement

if (typeof(x.y) !== 'undefined')

mais cela semble un peu maladroit. Y a-t-il un meilleur moyen?

278
user213154

L'objet a la propriété:

Si vous testez des propriétés se trouvant sur l'objet lui-même (ne faisant pas partie de la chaîne de prototypes), vous pouvez utiliser .hasOwnProperty() :

if (x.hasOwnProperty('y')) { 
  // ......
}

L'objet ou son prototype a une propriété:

Vous pouvez utiliser l'opérateur in pour tester les propriétés héritées.

if ('y' in x) {
  // ......
}
521
gnarf

Si vous voulez savoir si l'objet physiquement contient la propriété @ gnarf answer en utilisant hasOwnProperty fera le travail.

Si vous voulez savoir si la propriété existe quelque part, sur l'objet lui-même ou dans la chaîne de prototypes, vous pouvez utiliser l'opérateur in .

if ('prop' in obj) {
  // ...
}

Par exemple.:

var obj = {};

'toString' in obj == true; // inherited from Object.prototype
obj.hasOwnProperty('toString') == false; // doesn't contains it physically
75
CMS

Underscore.js ou Lodash

if (_.has(x, "y")) ...

:)

15
nackjicholson

Vous pouvez couper ça un peu comme ça:

if ( x.y !== undefined ) ...
14
jpsimons

Une caractéristique de mon code d'origine

if ( typeof(x.y) != 'undefined' ) ...

cela peut être utile dans certaines situations est qu'il est sûr d'utiliser si x existe ou pas. Avec l'une des méthodes de la réponse de gnarf, il faut d'abord tester x s'il existe un doute quant à son existence.

Alors peut-être que les trois méthodes ont leur place dans la panoplie d’astuces.

7
user213154

Étant donné que la question portait sur la clarté de la vérification des propriétés, et sur un cas d'usage courant pour cela, à savoir la validation des objets options d'argument de fonction, j'ai pensé mentionner un moyen rapide, sans bibliothèque, de tester l'existence de plusieurs propriétés. Clause de non-responsabilité: ECMAScript 5 est requis (mais toute personne utilisant OMI utilisant encore IE8 mérite un site Web défectueux).

function f(opts) {
  if(!["req1","req2"].every(opts.hasOwnProperty, opts)) {
      throw new Error("IllegalArgumentException");
  }
  alert("ok");
}
f({req1: 123});  // error
f({req1: 123, req2: 456});  // ok
1
stt