object jquery - Comment déterminer si un objet a une propriété donnée dans JavaScript




selectionner element (8)

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

J'utilise actuellement

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

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


Answers

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!");

Une caractéristique de mon code d'origine

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

cela peut être utile dans certaines situations, c'est-à-dire que l'utilisation de x existe ou non. Avec l'une ou l'autre des méthodes de la réponse de gnarf, il faut d'abord tester x s'il y a un doute s'il existe.

Alors peut-être que les trois méthodes ont leur place dans un sac de trucs.


Si vous voulez savoir si l'objet contient physiquement @gnarf's réponse de la propriété @gnarf's utilisant hasOwnProperty , faites le travail.

Si vous voulez savoir si la propriété existe, que ce soit sur l'objet lui-même ou dans la chaîne du prototype, 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

Puisque la question concernait le clunkiness de la vérification des propriétés, et une utilisation usuelle pour valider les objets d'options de la fonction, je pensais que je mentionnerais une méthode courte et sans bibliothèque pour tester l'existence de plusieurs propriétés. Clause de non-responsabilité: Il nécessite ECMAScript 5 (mais toute personne utilisant encore IE8 mérite un site web cassé).

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

Underscore.js ou Lodash

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

:)


Voici comment j'ai écrit ce composant réutilisable object-hasOwnProperty pour vérifier si un objet a la propriété dsproperty, en retournant un booléen:

function hasOwnProperty(obj: {}, prop: string|number): boolean {
  return Object.prototype.hasOwnProperty.call(obj, prop);
};

Il ne monte pas la chaîne du prototype, et voici des exemples pertinents:

hasOwnProperty({foo: 'bar'}, 'foo') // => true
hasOwnProperty({foo: 'bar'}, 'bar') // => false

Également ajouté 3 tests pour montrer comment il gère différents cas d'utilisation (valeur, n'a pas de valeur, est nul)


L'objet a la propriété:

Si vous testez des propriétés qui se trouvent sur l'objet lui-même (ne faisant pas partie de sa chaîne prototype), 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 également.

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







javascript object