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?
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) {
// ......
}
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
vous pouvez le couper un peu comme ceci:
if ( x.y !== undefined ) ...
trait de Soulignement.js ou Lodash
if (_.has(x, "y")) ...
:)
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.
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
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!");
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.