Object.hasOwn()
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.
El método estático Object.hasOwn()
devuelve true
si el objeto especificado tiene la propiedad indicada como propiedad propia. Si la propiedad es heredada, o no existe, el método devuelve false
.
Nota: Object.hasOwn()
está pensada como un reemplazo de Object.prototype.hasOwnProperty()
.
Pruébalo
Sintaxis
Object.hasOwn(obj, prop)
Parametros
Valor de retorno del método
true
si el objeto tiene definido directamente la propiedad especificada. De lo contrario false
Descripción
El método Object.hasOwn()
devuelve true
si la propiedad especificada es una propiedad directa del objeto — incluso si el valor de la propiedad es null
o undefined
.
El método devuelve false
si la propiedad es heredada, o no ha sido declarado en absoluto.
A diferencia del operador in
, este método no comprueba la propiedad especificada en la cadena de prototipos del objeto.
Se recomienda sobre Object.prototype.hasOwnProperty()
porque funciona para objetos creados usando Object.create(null)
y con objetos que anulan el método hasOwnProperty()
. Si bien es posible solucionar estos problemas llamando a Object.prototype.hasOwnProperty()
en un objeto externo, Object.hasOwn()
es mas intuitivo.
Ejemplos
Usando hasOwn para probar la existencia de una propiedad
El siguiente código muestra como determinar si el objeto example
contiene una propiedad llamada prop
.
const example = {};
Object.hasOwn(example, "prop"); // false - 'prop' no ha sido definido
example.prop = "existe";
Object.hasOwn(example, "prop"); // true - 'prop' ha sido definido
example.prop = null;
Object.hasOwn(example, "prop"); // true - la propiedad existe con valor nulo
example.prop = undefined;
Object.hasOwn(example, "prop"); // true - la propiedad existe con valor de indefinido
Propiedades directas vs. heredadas
El siguiente ejemplo diferencía entre propiedades directas y propiedades heredadas mediante la cadena de prototipos:
const example = {};
example.prop = "existe";
// `hasOwn` solo devolverá verdadero para propiedades directas:
Object.hasOwn(example, "prop"); // Devuelve verdadero
Object.hasOwn(example, "toString"); // Devuelve falso
Object.hasOwn(example, "hasOwnProperty"); // Devuelve falso
// El operador `in` devolverá verdadero para propiedades directas o heredadas:
"prop" in example; // Devuelve verdadero
"toString" in example; // Devuelve verdadero
"hasOwnProperty" in example; // Devuelve verdadero
Iterando sobre las propiedades de un objeto
Para iterar sobre las propiedades enumerables de un objeto, debe usar:
const example = { foo: true, bar: true };
for (const name of Object.keys(example)) {
// …
}
Pero si necesita usar for...in
, se puede usar Object.hasOwn()
para omitir las propiedades heredadas:
const example = { foo: true, bar: true };
for (const name in example) {
if (Object.hasOwn(example, name)) {
// …
}
}
Comprobando si el índice de un arreglo existe
Los elementos de un Array
son definidos como propiedades directas, asi que se puede usar el método hasOwn()
para comprobar si existe un índice en particular:
const fruits = ["Apple", "Banana", "Watermelon", "Orange"];
Object.hasOwn(fruits, 3); // true ('Orange')
Object.hasOwn(fruits, 4); // false - not defined
Casos problematicos de hasOwnProperty
Esta sección demuestra que hasOwn()
es inmune a los problemas que afectan hasOwnProperty
. En primer lugar, puede usarse con objetos que han reimplementado hasOwnProperty()
:
const foo = {
hasOwnProperty() {
return false;
},
bar: "Los dragones están fuera de la oficina",
};
if (Object.hasOwn(foo, "bar")) {
console.log(foo.bar); //true - la reimplementación de hasOwnProperty() no afecta a Object
}
También se puede usar para probar objetos creados usando
Object.create(null)
. Estos no heredan de Object.prototype
, por lo que hasOwnProperty()
es inaccesible.
const foo = Object.create(null);
foo.prop = "existe";
if (Object.hasOwn(foo, "prop")) {
console.log(foo.prop); //true - funciona independientemente de cómo se crea el objeto.
}
Especificaciones
Specification |
---|
ECMAScript Language Specification # sec-object.hasown |
Compatibilidad con navegadores
BCD tables only load in the browser