Réponses:
Si vous testez des propriétés qui se trouvent sur l'objet lui-même (ne faisant pas partie de sa chaîne de prototypes), vous pouvez utiliser .hasOwnProperty()
:
if (x.hasOwnProperty('y')) {
// ......
}
Vous pouvez également utiliser l' in
opérateur pour tester les propriétés héritées.
if ('y' in x) {
// ......
}
{}.hasOwnProperty.call(x, 'y')
.
Si vous voulez savoir si l'objet contient physiquement la réponse de la propriété @ gnarf en utilisant hasOwnProperty
fera le travail.
Si vous voulez savoir si la propriété existe n'importe où, soit sur l'objet lui-même, soit dans la chaîne du prototype, vous pouvez utiliser l' 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
Underscore.js ou Lodash
if (_.has(x, "y")) ...
:)
Object.prototype.hasOwnProperty.call(x, "y")
. Pour les tableaux , je pense que vous voudrez peut - être Array.prototype.indexOf
, _.indexOf
ou_.contains
Une caractéristique de mon code d'origine
if ( typeof(x.y) != 'undefined' ) ...
ce qui peut être utile dans certaines situations, c'est qu'il est sûr d'utiliser qu'il 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 existe un doute quant à son existence.
Alors peut-être que les trois méthodes ont leur place dans leur sac de trucs.
(x && x.hasOwnProperty('y'))
ou(x && 'y' in x)
ReferenceError
plutôt que la chaîne «non défini»
Étant donné que la question concernait la lourdeur de la vérification des propriétés, et une utilisation régulière pour cela étant la validation des objets d'options d'argument de fonction, j'ai pensé mentionner un moyen court sans bibliothèque de tester l'existence de plusieurs propriétés. Avertissement: il nécessite ECMAScript 5 (mais IMO 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
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!");
x.hasOwnProperty('y')
?
Object.prototype.hasOwnProperty.call(x, 'y')
, de sorte que la propriété nommée "hasOwnProperty" n'entre pas en conflit avec le processus d'inspection;)