¿Cómo comprobar si el objeto tiene alguna propiedad en JavaScript?
Suponiendo que declaro
var ad = {};
¿Cómo puedo comprobar si este objeto contendrá propiedades definidas por el usuario?
Puede utilizar el método integrado Object.keys
para obtener una lista de claves de un objeto y probar su longitud.
var x = {};
// some code where value of x changes and than you want to check whether it is null or some object with values
if(Object.keys(x).length){
// Your code here if x has some properties
}
¿Qué tal hacer una función simple?
function isEmptyObject(obj) {
for(var prop in obj) {
if (Object.prototype.hasOwnProperty.call(obj, prop)) {
return false;
}
}
return true;
}
isEmptyObject({}); // true
isEmptyObject({foo:'bar'}); // false
La hasOwnProperty
llamada al método directamente en Object.prototype
es solo para agregar un poco más de seguridad ; imagine lo siguiente usando una obj.hasOwnProperty(...)
llamada normal:
isEmptyObject({hasOwnProperty:'boom'}); // false
Nota: (para el futuro) El método anterior se basa en la for...in
declaración, y esta declaración se repite solo sobre propiedades enumerables ; en el estándar ECMAScript más implementado actualmente (tercera edición), el programador no tiene ninguna forma de crear propiedades no enumerables. .
Sin embargo, esto ha cambiado ahora con ECMAScript 5.ª edición y podemos crear propiedades que no se pueden enumerar, escribir ni eliminar, por lo que el método anterior puede fallar , por ejemplo:
var obj = {};
Object.defineProperty(obj, 'test', { value: 'testVal',
enumerable: false,
writable: true,
configurable: true
});
isEmptyObject(obj); // true, wrong!!
obj.hasOwnProperty('test'); // true, the property exist!!
Una solución ECMAScript 5 a este problema sería:
function isEmptyObject(obj) {
return Object.getOwnPropertyNames(obj).length === 0;
}
El Object.getOwnPropertyNames
método devuelve un archivo Array
que contiene los nombres de todas las propiedades propias de un objeto, enumerables o no . Este método lo están implementando ahora los proveedores de navegadores, ya está en Chrome 5 Beta y en las últimas WebKit Nightly Builds.
Object.defineProperty
también está disponible en esos navegadores y en las últimas versiones de Firefox 3.7 Alpha.
Puede recorrer las propiedades de su objeto de la siguiente manera:
for(var prop in ad) {
if (ad.hasOwnProperty(prop)) {
// handle prop as required
}
}
Es importante utilizar el hasOwnProperty()
método para determinar si el objeto tiene la propiedad especificada como propiedad directa y no heredada de la cadena prototipo del objeto.
Editar
De los comentarios: Puedes poner ese código en una función, y hacer que devuelva falso en cuanto llegue a la parte donde está el comentario.
Con jQuery puedes usar:
$.isEmptyObject(obj); // Returns: Boolean
A partir de jQuery 1.4, este método verifica tanto las propiedades del objeto en sí como las propiedades heredadas de los prototipos (en el sentido de que no usa hasOwnProperty).
Con ECMAScript 5.ª edición en navegadores modernos (IE9+, FF4+, Chrome5+, Opera12+, Safari5+) puede utilizar el método Object.keys integrado:
var obj = { blah: 1 };
var isEmpty = !Object.keys(obj).length;
O simple y antiguo JavaScript:
var isEmpty = function(obj) {
for(var p in obj){
return false;
}
return true;
};