-
if(object.property)
va échouer dans les cas, il n'est pas défini (qui est ce que vous voulez), et dans les cas elle a été fixée à une valeur fausse, par exemple, undefined
, null
, 0
etc (ce qui n'est pas ce que vous voulez).
var object = {property: 0};
if(object.property) { ... } // will not run
-
if('property' in object)
est un peu mieux, car il sera fait retour si l'objet a vraiment du bien, ne cherche pas à sa valeur.
var object = {property: 0};
if('property' in object) { ... } // will run
if('toString' in object) { ... } // will also run; from prototype
-
if(object.hasOwnProperty('property'))
c'est encore mieux, car il vous permettra de distinguer entre les propriétés de l'occurrence et les propriétés du prototype.
var object = {property: 0};
if(object.hasOwnProperty('property')) { ... } // will run
if(object.hasOwnProperty('toString')) { ... } // will not run
Je dirais que la performance n'est pas que les grandes d'un problème ici, sauf si vous êtes à la vérification des milliers de fois par seconde, mais dans ce cas, vous devriez envisager une autre structure du code. L'ensemble de ces fonctions/syntaxes sont pris en charge par les navigateurs récents, hasOwnProperty
a été autour pendant un long moment, trop.
Edit: Vous pouvez également effectuer une fonction pour vérifier l'existence d'une propriété en passant n'importe quoi (même des choses qui ne sont pas des objets) comme un objet, comme ceci:
function has(obj, prop) {
return Object.prototype.hasOwnProperty.call(obj, prop);
}
Maintenant cela fonctionne:
has(window, 'setTimeout'); // true
même si window.hasOwnProperty === undefined
(ce qui est le cas dans la version de IE 8 ou inférieur).