如何使用默认值从Object获取值

Jer*_* S. 57 javascript object

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

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;
} 
Run Code Online (Sandbox Code Playgroud)

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

var url = '<some-url>?id='+arg1+'&='+arg2 +'=' + arg3;
Run Code Online (Sandbox Code Playgroud)

jQuery/ExtJS或任何其他框架是否提供了一种以简单的方式访问这样的变量的解决方案,并为变量赋予默认值?

就像是:

getValueOfObject(config,'args.arg3','<default>');
Run Code Online (Sandbox Code Playgroud)

或者可能有一个标准的解决方案.

注意:

我也在考虑你有默认值的常见模式

var defaults = {
   args: {
      args1: ....
   }
   ...
}
Run Code Online (Sandbox Code Playgroud)

并做一个对象合并.

然后将对象编码为param String.但正如您所看到的,对象有时也包含参数名称.

kar*_*m79 67

通常,当某些变量求值为falsy时,可以使用or运算符指定默认值:

var foo = couldBeUndefined || "some default";
Run Code Online (Sandbox Code Playgroud)

所以:

var arg1 = config.args.arg1 || "test";
var arg2 = config.args.arg2 || "param2";
Run Code Online (Sandbox Code Playgroud)

假设config.args始终定义,正如您的示例代码所暗示的那样.

  • 这里有一个很大的缺陷.如果`couldBeUndefined = 0`或任何其他假值,则`foo ="某些默认值"`,而不是获得所需的`foo = 0` (17认同)
  • 我相信如果`config.args.arg1`未定义就可以了,但如果`config`或`config.args`本身未定义,这不会失败吗? (5认同)
  • 如果值为false,则会失败.你应该做`typeof xy!='undefined'?xy:"";` (5认同)
  • @karim79他暗示`config.args.arg1`会抛出`config.args === undefined` (4认同)
  • 当arg是布尔值且默认值为true时,一切都毁了. (4认同)
  • 请注意,在最近的 JS 中,您可以使用“??”而不是“||”,它只匹配空值,而不是 falsey,这可能会解决上述一些问题。请参阅 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator (3认同)

Tim*_*hiy 43

在 ECMAScript 2020 中,使用Nullish 合并运算符可能比or使用运算符更安全。

let foo = obj.maybeUndefined ?? "default value";
Run Code Online (Sandbox Code Playgroud)

JS 将 0、-0、null、false、NaN、undefined 或空字符串 ("") 视为falsy。因此,or在下面的示例中使用运算符设置默认值可能会导致意外结果

let obj = { maybeUndefined: 0 };
let foo = obj.maybeUndefined || 1; // foo == 1
Run Code Online (Sandbox Code Playgroud)

这里,当实际定义时,foo变得等于, 。如果 只有当实际上是or时才应该分配默认值,那么我们可以使用Nullish 合并运算符1maybeUndefinedfoomaybeUndefinedundefinednull

let obj = { maybeUndefined: 0 };
let foo = obj.maybeUndefined ?? 1; // foo == 0

let obj = {};
let foo = obj.maybeUndefined ?? 1; // foo == 1
Run Code Online (Sandbox Code Playgroud)


Jer*_* S. 17

看起来最后lodash__get()函数!


Clé*_*ent 8

使用 ES2018,您现在可以编写options = { ...defaults, ...options }

传播语法- JavaScript | MDN

现在可以使用比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 }
Run Code Online (Sandbox Code Playgroud)

  • 不知道为什么这被否决了。我投了赞成票 FWIW (2认同)