How to get value from Object, with default value
Solution 1:
Generally, one can use the or operator to assign a default when some variable evaluates to falsy:
var foo = couldBeUndefined || "some default";
so:
var arg1 = config.args.arg1 || "test";
var arg2 = config.args.arg2 || "param2";
assuming that config.args
is always defined, as your example code implies.
Solution 2:
Looks like finally lodash has the _.get() function for this!
Solution 3:
With ECMAScript 2020 it may be safer to use Nullish coalescing operator than or
operator.
let foo = obj.maybeUndefined ?? "default value";
JS treats 0, -0, null, false, NaN, undefined, or the empty string ("") as falsy
. So, using or
operator for setting a default value in the following example may cause unexpected results
let obj = { maybeUndefined: 0 };
let foo = obj.maybeUndefined || 1; // foo == 1
Here, foo
becomes equal to 1
, when maybeUndefined
is actually defined. If foo
should be assigned a default value only when maybeUndefined
is actually undefined
or null
, then we can use Nullish coalescing operator.
let obj = { maybeUndefined: 0 };
let foo = obj.maybeUndefined ?? 1; // foo == 0
let obj = {};
let foo = obj.maybeUndefined ?? 1; // foo == 1
Solution 4:
With ES2018, you can now write options = { ...defaults, ...options }
:
Spread syntax - JavaScript | MDN
Shallow-cloning (excluding prototype) or merging of objects is now possible using a shorter syntax than
Object.assign()
.const obj1 = { foo: 'bar', x: 42 }; const obj2 = { foo: 'baz', y: 13 }; const clonedObj = { ...obj1 }; // Object { foo: "bar", x: 42 } const mergedObj = { ...obj1, ...obj2 }; // Object { foo: "baz", x: 42, y: 13 }
Solution 5:
try var options = extend(defaults, userOptions);
This way you get all the userOptions and fall back to defaults when they don't pass any options.
Note use any extend
implementation you want.