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.