Existe-t-il un moyen de définir l'attribut par défaut d'un objet Javascript de telle sorte que :
let emptyObj = {};
// do some magic
emptyObj.nonExistingAttribute // => defaultValue
Existe-t-il un moyen de définir l'attribut par défaut d'un objet Javascript de telle sorte que :
let emptyObj = {};
// do some magic
emptyObj.nonExistingAttribute // => defaultValue
J'ai vu un article hier qui mentionne une Object.__noSuchMethod__
propriété : JavascriptTips Je n'ai pas eu l'occasion de jouer avec, donc je ne sais pas si le navigateur est compatible, mais vous pourriez peut-être l'utiliser d'une manière ou d'une autre ?
Je suis surpris que personne n'ait encore mentionné l'opérateur ternaire.
var emptyObj = {a:'123', b:'234', c:0};
var defaultValue = 'defaultValue';
var attr = 'someNonExistAttribute';
emptyObj.hasOwnProperty(attr) ? emptyObj[attr] : defaultValue;//=> 'defaultValue'
attr = 'c'; // => 'c'
emptyObj.hasOwnProperty(attr) ? emptyObj[attr] : defaultValue; // => 0
De cette façon, même si la valeur de 'c' est 0, la valeur correcte sera obtenue.
Il est en fait possible de le faire avec Object.create
. Cela ne fonctionnera pas pour les propriétés "non définies". Mais pour celles qui ont reçu une valeur par défaut.
var defaults = {
a: 'test1',
b: 'test2'
};
Ensuite, lorsque vous créez votre objet de propriétés, vous le faites avec Object.create
properties = Object.create(defaults);
Maintenant, vous aurez deux objets dont le premier est vide, mais dont le prototype pointe vers l'objet defaults
objet. Pour tester :
console.log('Unchanged', properties);
properties.a = 'updated';
console.log('Updated', properties);
console.log('Defaults', Object.getPrototypeOf(properties));
var obj = {
a: 2,
b: 4
};
console.log(obj);
--> {a: 2, b: 4}
function applyDefaults(obj) {
obj.a ||= 10;
obj.b ||= 10;
obj.c ||= 10;
}
// do some magic
applyDefaults(obj);
console.log(obj);
--> {a: 2, b: 4, c: 10}
Cela fonctionne parce que
undefined || "1111111" --> "1111111"
"0000000" || "1111111" --> "0000000"
comme null
, undefined
, NaN
, 0
, ""
(Chaîne vide), false
lui-même, sont tous considérés comme équivalents à faux ( falsy ). Tout le reste est true
( véridique ).
Notez que cela n'est pas pris en charge uniformément par tous les navigateurs et toutes les versions de nodejs (confirmez par vous-même).
Ainsi, deux cas gênants sont la chaîne vide ""
et 0
(zéro). S'il est important de ne pas les écraser, vous devrez peut-être réécrire ceci comme suit :
if (typeof obj.d == "undefined") obj.d = "default"
Cela sera également mieux supporté par les navigateurs.
Vous pourriez aussi écrire ceci comme suit :
obj.d ??= "default"
C'est le Affectation nulle qui ne s'applique qu'aux valeurs qui sont null
ou undefined
( nullish ) - dont la chaîne vide est pas partie. Cependant, la prise en charge des navigateurs croisés est encore une fois réduite.
Voir aussi sur le site officiel de Mozilla - Attribution d'une valeur par défaut à une variable .
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
0 votes
TOUT attribut non existant ou simplement un nom d'attribut CONNU ?
1 votes
let o = new Proxy({}, { get: (o, k) => k in o ? o[k] : 'some default value' }; console.log(o.key1)