Object.hasOwn()

Expérimental: Cette fonction est expérimentale
Puisque cette fonction est toujours en développement dans certains navigateurs, veuillez consulter le tableau de compatibilité pour les préfixes à utiliser selon les navigateurs.
Il convient de noter qu'une fonctionnalité expérimentale peut voir sa syntaxe ou son comportement modifié dans le futur en fonction des évolutions de la spécification.

La méthode statique Object.hasOwn() renvoie true si l'objet indiqué possède la propriété indiquée comme propriété propre. Si la propriété est héritée ou qu'elle n'existe pas, la méthode renverra false.

Note : Object.hasOwn() est conçu comme une méthode de remplacement pour Object.hasOwnProperty().

Exemple interactif

Syntaxe

js
Object.hasOwn(instance, prop);

Paramètres

instance

L'objet JavaScript pour lequel on souhaite tester la présence d'une propriété.

prop

Une chaîne de caractères (String) indiquant le nom de la propriété recherchée ou un symbole (Symbol) désignant la propriété.

Valeur de retour

true si l'objet indiqué possède, directement, la propriété indiquée, false sinon.

Description

La méthode Object.hasOwn() renvoie true si la propriété indiquée est une propriété directe de l'objet (et même si celle-ci vaut null ou undefined). La méthode renvoie false si la propriété est héritée ou si elle n'a pas été déclarée. À la différence de l'opérateur in, cette méthode ne consulte pas la chaîne de prototypes de l'objet pour détecter la propriété.

Object.hasOwn() pourra être recommandée en lieu et place de Object.hasOwnProperty() car elle fonctionne sur les objets créés avec Object.create(null) et pour les objets qui ont surchargé la méthode héritée hasOwnProperty(). Bien qu'il soit possible de contourner ces deux problèmes en invoquant Object.prototype.hasOwnProperty() sur un objet externe, Object.hasOwn() semble plus intuitif.

Exemples

Utiliser Object.hasOwn() pour tester l'existence d'une propriété

Le code suivant illustre comment déterminer si l'objet exemple contient une propriété intitulée prop.

js
let exemple = {};
Object.hasOwn(exemple, "prop"); // false : 'prop' n'a pas été définie

exemple.prop = "existe";
Object.hasOwn(exemple, "prop"); // true : 'prop' a été définie

exemple.prop = null;
Object.hasOwn(exemple, "prop"); // true : la propriété existe malgré sa valeur null

exemple.prop = undefined;
Object.hasOwn(exemple, "prop"); // true : la propriété existe malgré sa valeur undefined

Propriétés propres et propriétés héritées

Dans l'exemple suivant, on distingue les propriétés propres/directes et celles qui sont héritées via la chaîne de prototypes :

js
let exemple = {};
exemple.prop = "existe";

// `Objet.hasOwn()` renverra true seulement pour les propriétés propres
Object.hasOwn(exemple, "prop"); // renvoie true
Object.hasOwn(exemple, "toString"); // renvoie false
Object.hasOwn(exemple, "hasOwnProperty"); // renvoie false

// L'opérateur `in` renverra true pour les propriétés propres et héritées
"prop" in exemple; // renvoie true
"toString" in exemple; // renvoie true
"hasOwnProperty" in exemple; // renvoie true

Parcourir les propriétés d'un objet=

Pour parcourir les propriétés énumérables d'un objet, on privilégiera cette forme :

js
let exemple = { toto: true, truc: true };
for (let nom of Object.keys(exemple)) {
  // …
}

S'il est nécessaire d'utiliser for..in, on pourra utiliser Object.hasOwn() afin de filtrer les propriétés héritées :

js
let exemple = { toto: true, truc: true };
for (let nom in exemple) {
  if (Object.hasOwn(exemple, nom)) {
    // …
  }
}

Vérifier l'existence d'un indice dans un tableau

Les éléments d'un tableau (Array) sont définis comme propriétés propres. Ainsi, Object.hasOwn() pourra être utilisé pour vérifier si un indice donné existe :

js
let fruits = ["Pomme", "Banane", "Melon", "Orange"];
Object.hasOwn(fruits, 3); // true ('Orange')
Object.hasOwn(fruits, 4); // false, non défini

Cas problématiques pour hasOwnProperty()

Cette section illustre l'immunité de Object.hasOwn() concernant des problèmes qui se posent pour Object.prototype.hasOwnProperty(). Tout d'abord, on peut utiliser cette première avec des objets qui ont réimplémenté hasOwnProperty() :

js
let toto = {
  hasOwnProperty: function () {
    return false;
  },
  truc: "Ga bu zo meu",
};

if (Object.hasOwn(toto, "truc")) {
  console.log(toto.truc); //true - la surcharge de hasOwnProperty() n'a pas d'impact
}

On peut également l'utiliser pour tester des objets créés avec Object.create(null) qui n'héritent pas de Object.prototype et pour qui hasOwnProperty() est donc inaccessible.

js
let toto = Object.create(null);
toto.prop = "existe";
if (Object.hasOwn(toto, "prop")) {
  console.log(toto.prop); // true.
}

Spécifications

Specification
ECMAScript Language Specification
# sec-object.hasown

Compatibilité des navigateurs

BCD tables only load in the browser

Voir aussi