Dans votre exemple, pour vérifier:
if (map['foo']) {
//..
}
Non vérifie uniquement si la propriété n'est pas définie sur l'objet, l'expression de condition de l'instruction if
évalue à false
également si la propriété contient une valeur qui se contraint à false
sur le contexte booléen (alias valeurs falsifiées), par exemple 0
, NaN
, un chaîne vide, null
, undefined
et bien sûr false
, par exemple:
var map = {
'foo': 0 // or any other falsy value
};
if (map['foo']) {
// foo is truthy...
} else {
// foo is falsy or not defined
}
Pour vérifier si une propriété existe sur un objet, quelle que soit sa valeur -qui peut être falsy, même undefined
-, vous pouvez utiliser la méthode hasOwnProperty
, par exemple:
var map = {};
map['foo'] = 0;
if (map.hasOwnProperty('foo')) {
// foo exist physically on the object...
}
Le seul problème avec cette méthode est que si quelqu'un ajoute une propriété nommée hasOwnProperty
à un objet, il ne fonctionnera pas, par exemple:
var obj = {
hasOwnProperty: 'bar'
};
Si vous exécutez obj.hasOwnProperty('prop')
, il vous donnera un TypeError
, parce que l'objet contient une propriété de chaîne ombres la méthode -invoking la chaîne provoquerait la ERROR-.
Une solution à cela est d'appeler la méthode hasOwnProperty
directement à partir de l'objet Object.prototype
, par exemple:
if (Object.prototype.hasOwnProperty.call(obj, 'prop')) {
//..
}
Vous pouvez également utiliser le in
operator:
if ('prop' in obj) {
//...
}
La différence avec la première méthode est que l'opérateur in
vérifie également les propriétés héritées, par exemple:
var obj = {};
obj.hasOwnProperty('toString'); // false
'toString' in obj; // true, inherited from Object.prototype.toString
Voir aussi:
Edit:
Extension ma réponse au commentaire de @slebetman, sur la vérification if (map.foo !== undefined)
.
Comme je commentais, il y a des préoccupations au sujet de l'accès à la propriété globale undefined
et aussi une différence sémantique entre vérification d'une valeur de la propriété par rapport existence de la propriété.
La propriété globale undefined
n'est pas défini en lecture seule ECMAScript 3e édition Standard, (est maintenant writable = false
sur ES5 :)
Dans presque toutes les implémentations sa valeur peut être remplacée.
Si quelqu'un fait:
window.undefined = 'foo';
// It will break your code:
var obj = {};
if (obj.foo !== undefined) {
alert("This shouldn't ever happen!");
}
aussi la différence sémantique: en testant si map.foo !== undefined
nous ne vérifient pas sur le plan technique que si la propriété existe sur l'objet ou non, une propriété peut exister, exploitation non définie comme valeur , par exemple:
var map = {
'foo': undefined
};
map.hasOwnProperty('foo'); // true, because the property exists although
// it holds the undefined value
map.foo !== undefined; // false
Pour les objets vides créés directement à partir de l'objet Object (ce qui est vrai dans ce cas), l'utilisation de hasOwnProperty n'est pas nécessaire. Vérifiez directement si la valeur n'est pas définie: 'if (map.foo! == undefined)'. – slebetman
@slebetman, oui mais l'accès à la propriété globale 'undefined' en tant qu'identifiant ne pose aucun problème, 1. ne fait pas partie d'ECMAScript 3, (est maintenant défini sur ES5 :), 2. Dans certaines implémentations, la propriété n'est pas lue -seulement, sa valeur peut être remplacée, par exemple si quelqu'un fait 'window.undefined = true;', il va casser votre code. En vérifiant également 'map.foo! == undefined' nous ne vérifions pas techniquement si la propriété * existe * sur l'objet ou non, une propriété * peut * exister, en maintenant' undefined' comme valeur. – CMS
@slebetman - Réfléchissez également aux modifications de 'Object.prototype'. Essayez ceci dans votre navigateur: 'javascript: Object.prototype.foo = 5; bar = {}; alert ((bar.foo! == undefined) +", "+ bar.hasOwnProperty (" foo ")); Object. prototype.hasOwnProperty = function() {return vrai}; alert (bar.hasOwnProperty ("baz")) ' –