Estou realmente confuso com as respostas que foram dadas - a maioria delas é totalmente incorreta. Obviamente, você pode ter propriedades de objetos que tenham valores indefinidos, nulos ou falsos. Portanto, basta reduzir a verificação da propriedade para typeof this[property]
, ou pior ainda, x.key
fornecer resultados completamente enganosos.
Depende do que você está procurando. Se você deseja saber se um objeto contém fisicamente uma propriedade (e não vem de algum lugar na cadeia de protótipos), então object.hasOwnProperty
é o caminho a seguir. Todos os navegadores modernos são compatíveis. (Faltava nas versões mais antigas do Safari - 2.0.1 e mais antigas - mas essas versões do navegador raramente são mais usadas.)
Se o que você está procurando é se um objeto tem uma propriedade iterável (quando você iterar sobre as propriedades do objeto, ele aparecerá), então o procedimento: prop in object
dará o efeito desejado.
Como usar hasOwnProperty
é provavelmente o que você deseja, e considerando que você pode querer um método de fallback, apresento a você a seguinte solução:
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 );
}
}
A descrição acima é uma solução funcional, em vários navegadores, hasOwnProperty
com uma ressalva: não é possível distinguir entre os casos em que uma propriedade idêntica está no protótipo e na instância - apenas assume que é proveniente do protótipo. Você pode mudar para ser mais branda ou estrita, com base na sua situação, mas, no mínimo, isso deve ser mais útil.