Como ya sabes, en JavaScript casi siempre existen muchas formas de hacer una misma cosa. En este post vamos a ver formas de comprobar si una llave existe en un objeto.
A través de hasOwnProperty()
Con el método hasOwnProperty() podemos saber si una propiedad concreta existe en un objeto:
const perro = { nombre: "Granuja", raza: "Golden Retriever", patas: 4, } console.log(perro.hasOwnProperty("patas")) // true
Lo único que debes saber sobre este método es que te devolverá true únicamente si tiene la propiedad indicada de forma directa. Si buscas una propiedad que haya podido heredar de uno de sus ancestros, entonces devolverá false tanto si existe como si no.
Con el operador in
En otro artículo sobre las formas de iterar con for en JavaScript ya vimos el operador in en los bucles for...in. El operador in también podemos usarlo para los condicionales:
const perro = { nombre: "Granuja", raza: "Golden Retriever", patas: 4, } // en este caso, nunca entraremos en el if // 'vacunas' in perro devuelve false if ("vacunas" in perro) { console.log("perro sano") }
En este caso, sí que se tendrán en cuenta propiedades que hayan sido heredadas, mira este otro ejemplo para entenderlo mejor:
class Animal { constructor(vacunas) { this.vacunas = vacunas } } class Perro extends Animal { constructor(nombre, raza, patas, vacunas) { super(vacunas) this.nombre = nombre this.raza = raza this.patas = patas } } const miPerro = new Perro("Rodolfo", "mezcla", 4, true) // en este caso, sí entra en el if // 'vacunas' in perro devuelve true if ("vacunas" in miPerro) { console.log("perro sano") }
Alternativa
Como alternativa, puedes aprovecharte del _optional chaining_ en JavaScript. De esta forma, no necesitas comprobar si una propiedad existe o no, puedes lidiar directamente con undefined:
const perro = { nombre: "Granuja", raza: "Golden Retriever", patas: 4, vacunas: { polivalente: true, leishmania: false, }, } if (perro.vacunas?.polivalente) { // true } if (perro.vacunas?.rabia) { // false (undefined)) }
Así que como puedes ver, tienes bastantes formas de comprobar si una propiedad existe o no en un objeto. De ti depende analizar cuál te viene mejor en cada caso. Yo, me inclino por usar el encadenamiento opcional y lidiar con undefined.