Sono davvero confuso dalle risposte che sono state date - la maggior parte di esse sono semplicemente errate. Ovviamente puoi avere proprietà dell'oggetto che hanno valori indefiniti, nulli o falsi. Quindi semplicemente riducendo il controllo della proprietà a typeof this[property]
, o peggio ancora, x.key
otterrai risultati completamente fuorvianti.
Dipende da cosa stai cercando. Se vuoi sapere se un oggetto contiene fisicamente una proprietà (e non proviene da qualche parte della catena del prototipo), allora object.hasOwnProperty
è la strada da percorrere. Tutti i browser moderni lo supportano. (Mancava nelle versioni precedenti di Safari - 2.0.1 e precedenti - ma quelle versioni del browser raramente vengono più utilizzate.)
Se quello che stai cercando è se un oggetto ha una proprietà che è iterabile (quando si scorre sulle proprietà dell'oggetto, apparirà), allora facendo: prop in object
ti darà l'effetto desiderato.
Poiché l'utilizzo hasOwnProperty
è probabilmente quello che desideri, e considerando che potresti voler un metodo di fallback, ti presento la seguente soluzione:
var obj = {
a: undefined,
b: null,
c: false
};
// a, b, c all found
for ( var prop in obj ) {
document.writeln( "Object1: " + prop );
}
function Class(){
this.a = undefined;
this.b = null;
this.c = false;
}
Class.prototype = {
a: undefined,
b: true,
c: true,
d: true,
e: true
};
var obj2 = new Class();
// a, b, c, d, e found
for ( var prop in obj2 ) {
document.writeln( "Object2: " + prop );
}
function hasOwnProperty(obj, prop) {
var proto = obj.__proto__ || obj.constructor.prototype;
return (prop in obj) &&
(!(prop in proto) || proto[prop] !== obj[prop]);
}
if ( Object.prototype.hasOwnProperty ) {
var hasOwnProperty = function(obj, prop) {
return obj.hasOwnProperty(prop);
}
}
// a, b, c found in modern browsers
// b, c found in Safari 2.0.1 and older
for ( var prop in obj2 ) {
if ( hasOwnProperty(obj2, prop) ) {
document.writeln( "Object2 w/ hasOwn: " + prop );
}
}
Quanto sopra è una soluzione funzionante, cross-browser, hasOwnProperty
con un avvertimento: non è in grado di distinguere tra casi in cui una proprietà identica si trova sul prototipo e sull'istanza - presuppone solo che provenga dal prototipo. Potresti spostarlo in modo che sia più indulgente o severo, in base alla tua situazione, ma almeno questo dovrebbe essere più utile.