如何从对象获取值,默认值

我经常发现自己将配置值传递给访问它们的函数,如下所示:

var arg1 = 'test1';
if(isUndefined(config.args.arg1)){
arg1 = config.args.arg1;
}


var arg2 = 'param2';
if(isUndefined(config.args.arg2)){
arg2 = config.args.arg2;
}


var arg3 = '123';
if(isUndefined(config.args.arg3)){
arg3 = config.args.arg3;
}

之后我会像这样使用它们:

var url = '<some-url>?id='+arg1+'&='+arg2 +'=' + arg3;

JQuery/ExtJS 或任何其他框架是否提供了一种简单的方法来访问这样的变量,并给变量一个默认值?

比如:

getValueOfObject(config,'args.arg3','<default>');

或者有没有一个标准的解决方案。

注意:

我还考虑了常见的默认模式

var defaults = {
args: {
args1: ....
}
...
}

并进行对象合并。

然后将对象编码为参数 String。但是正如您所看到的,对象 价值观有时也包含参数名称。

98493 次浏览

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.

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.

Looks like finally lodash has the _.get() function for this!

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 }

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