97 votes

Définir la valeur par défaut des attributs des objets Javascript

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

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)

2voto

James Long Points 1360

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 ?

2voto

Lin Dong Points 68

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.

1voto

Nils Points 1250

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));

1voto

Vlad V Points 39
Object.withDefault = (defaultValue,o={}) => {
  return new Proxy(o, {
    get: (o, k) => (k in o) ? o[k] : defaultValue 
  });
}

o = Object.withDefault(42);
o.x  //=> 42

o.x = 10
o.x  //=> 10
o.xx //=> 42

1voto

JoD. Points 188
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.com

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.

Powered by:

X