Comment déterminer si un objet possède une propriété donnée dans JavaScript

Comment puis-je déterminer si un objet x possède un bien défini y , quelle que soit la valeur de x.y ?

j'utilise actuellement

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

mais ça semble un peu lourd. Est-il un meilleur moyen?

240
demandé sur royhowie 2009-12-13 00:41:18

8 réponses

L'objet a une propriété:

si vous testez des propriétés qui sont sur l'objet lui-même (pas une partie de sa chaîne prototype), vous pouvez utiliser .hasOwnProperty() :

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

objet ou son prototype a une propriété:

vous pouvez utiliser l'opérateur in pour tester les propriétés qui sont héritées ainsi.

if ('y' in x) {
  // ......
}
469
répondu gnarf 2014-12-03 18:07:03

Si vous voulez savoir si l'objet physiquement contient la propriété @gnarf réponse à l'aide de hasOwnProperty va faire le travail.

si vous voulez savoir si la propriété existe n'importe où, soit sur l'objet lui-même ou dans la chaîne prototype, vous pouvez utiliser le in opérateur .

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
61
répondu CMS 2017-05-23 11:54:44

vous pouvez le couper un peu comme ceci:

if ( x.y !== undefined ) ...
11
répondu jpsimons 2009-12-12 21:56:52

trait de Soulignement.js ou Lodash

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

:)

9
répondu nackjicholson 2017-10-06 20:57:03

Une particularité de mon code d'origine

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

qui pourrait être utile dans certaines situations, c'est qu'il est sûr à utiliser si x existe ou pas. Avec l'une ou l'autre des méthodes dans la réponse de gnarf, on devrait d'abord tester pour x s'il y a un doute si elle existe.

donc peut-être les trois méthodes ont une place dans un sac de trucs.

5
répondu 2009-12-24 13:28:09

puisque la question portait sur le clunkiness de la vérification de propriété, et une usecase régulière pour cela étant la validation des objets d'options d'argument de fonction, j'ai pensé que je mentionnerais une façon courte bibliothèque-libre de tester l'existence de propriétés multiples. Avertissement: Il ne nécessite ECMAScript 5 (mais IMO encore quelqu'un avec IE8 mérite d'être cassé web).

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
répondu stt 2015-07-27 00:15:43

pourquoi pas simplement:

if (typeof myObject.myProperty == "undefined") alert("myProperty is not defined!");

ou si vous attendez un type spécifique:

if (typeof myObject.myProperty != "string") alert("myProperty has wrong type or does not exist!");
-1
répondu Dome 2015-09-25 09:41:58

où je veux savoir si un objet appelé foo a une propriété appelée Barre j'utilise simplement

if(foo.bar){
  //do stuff
}

Javascript renvoie false si la propriété n'existe pas. Il y a cependant des cas où cela est incorrect. Comme si la barre est prévu pour être un booléen ou un nombre qui peut être égale à zéro. Tout ce qui n'a pas de valeur est faux.

Sinon, je trouve que c'est la solution la plus élégante.

-1
répondu Dominic Grenier 2018-08-11 18:31:00