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?
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')) {
// ......
}
Vous pouvez utiliser l'opérateur in
pour tester les propriétés héritées.
if ('y' in x) {
// ......
}
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
Underscore.js ou Lodash
if (_.has(x, "y")) ...
:)
Vous pouvez couper ça un peu comme ça:
if ( x.y !== undefined ) ...
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.
É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