¿Cómo comprobar si el objeto tiene alguna propiedad en JavaScript?

Resuelto Ricky asked hace 14 años • 17 respuestas

Suponiendo que declaro

var ad = {}; 

¿Cómo puedo comprobar si este objeto contendrá propiedades definidas por el usuario?

Ricky avatar Apr 20 '10 13:04 Ricky
Aceptado

Puede utilizar el método integrado Object.keyspara 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  
}
Dhaval Chaudhary avatar Sep 19 '2016 05:09 Dhaval Chaudhary

¿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 hasOwnPropertyllamada al método directamente en Object.prototypees 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...indeclaració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.getOwnPropertyNamesmétodo devuelve un archivo Arrayque 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.definePropertytambién está disponible en esos navegadores y en las últimas versiones de Firefox 3.7 Alpha.

Christian C. Salvadó avatar Apr 20 '2010 07:04 Christian C. Salvadó

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.

Daniel Vassallo avatar Apr 20 '2010 06:04 Daniel Vassallo

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;
            };
kayz1 avatar Nov 15 '2013 07:11 kayz1