Verificación de existencia de clave en objeto JavaScript: análisis para principiantes
\n\n¿Alguna vez ha intentado obtener un valor de un objeto JavaScript y ha recibido un misterioso undefined como respuesta? Situación familiar, ¿verdad? Especialmente cuando se trabaja con datos de API, configuraciones o simplemente estructuras grandes. Hoy vamos a aclarar de una vez por todas cómo verificar correctamente si existe una clave en un objeto. Esta es una de las preguntas más populares en Stack Overflow, y no sin razón.
Imagine que el objeto es un armario con cajones. Quiere saber si hay un cajón etiquetado como "llaves". Puede simplemente tirar del tirador (y obtener un error si el cajón no existe), o puede primero mirar y asegurarse. En JavaScript tenemos hasta tres formas confiables de hacerlo. ¡Allá vamos!
\n\n¿Por qué verificar la existencia de una clave?
\n\nSupongamos que está escribiendo una aplicación para una lista de compras. Tiene un objeto cart que puede contener productos con cantidad:
const cart = {\n apples: 3,\n bananas: 5\n};\n\n// Queremos agregar peras, pero no sabemos si ya existen\nfunction addItem(item, quantity) {\n if (cart[item] !== undefined) {\n cart[item] += quantity;\n } else {\n cart[item] = quantity;\n }\n}\n\nEste código funcionará, pero tiene sus trampas. ¿Qué pasa si el valor de la clave es 0 o null? Entonces la verificación de undefined dará un resultado falso. Por lo tanto, analicemos los enfoques profesionales.
Método 1: Operador in — el todoterreno universal
\n\nEl operador in verifica si una propiedad existe en el objeto, incluyendo las propiedades heredadas. Esta es la forma más confiable cuando necesita saber si una clave existe en absoluto.
const user = {\n name: 'Ana',\n age: 25,\n isAdmin: false\n};\n\nconsole.log('name' in user); // true\nconsole.log('age' in user); // true\nconsole.log('salary' in user); // false\nconsole.log('toString' in user); // true (heredado de Object)\n\nVentajas: funciona incluso si el valor es null, undefined o false. Verifica toda la cadena de prototipos.
Desventajas: puede encontrar propiedades heredadas que no necesita. Por ejemplo, toString o hasOwnProperty.
Para la mayoría de los casos, in es la opción ideal. Especialmente cuando trabaja con objetos-diccionario comunes.
Método 2: hasOwnProperty() — solo sus propias claves
\n\nSi necesita verificar solo las propiedades propias del objeto (no las heredadas), use el método hasOwnProperty. Este es un método estándar de todos los objetos en JavaScript.
const book = {\n title: 'JavaScript para principiantes',\n pages: 300\n};\n\nconsole.log(book.hasOwnProperty('title')); // true\nconsole.log(book.hasOwnProperty('pages')); // true\nconsole.log(book.hasOwnProperty('toString')); // false (no es propiedad propia)\nconsole.log(book.hasOwnProperty('author')); // false\n\nTenga en cuenta: hasOwnProperty no verifica propiedades heredadas. Esto lo hace indispensable cuando crea objetos con clases o prototipos.
¡Pero hay un detalle! Si su objeto fue creado con Object.create(null), no tendrá el método hasOwnProperty. ¿Qué hacer? Use una llamada segura:
const dict = Object.create(null);\ndict.key1 = 'value1';\n\n// Esto no funcionará:\n// console.log(dict.hasOwnProperty('key1')); // TypeError\n\n// Pero esto sí:\nconsole.log(Object.prototype.hasOwnProperty.call(dict, 'key1')); // true\n\nLa sintaxis moderna permite usar Object.hasOwn() — un método estático añadido en ES2022. Resuelve este problema de forma elegante:
console.log(Object.hasOwn(dict, 'key1')); // true\n\nRecomiendo usar Obj