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.
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
Object.hasOwn(instance, prop);
Paramètres
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
.
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 :
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 :
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 :
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 :
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()
:
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.
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
- Caractère énumérable et rattachement des propriétés
- Héritage et chaîne de prototypes dans le guide JavaScript
Object.hasOwnProperty()
Object.getOwnPropertyNames()
for...in
in
- Une prothèse d'émulation pour
Object.hasOwn()
disponible aveccore-js