【问题标题】:How to get value from Object, with default value如何使用默认值从对象中获取值
【发布时间】:2012-02-18 17:06:43
【问题描述】:

我经常发现自己将配置值传递给像这样访问它们的函数:

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: ....
   }
   ...
}

并进行对象合并。

然后将对象编码为参数字符串。但正如您所见,对象 values 有时也包含参数名称。

【问题讨论】:

    标签: javascript object


    【解决方案1】:

    借助 ECMAScript 2020,使用 Nullish coalescing operator 可能比使用 or 运算符更安全。

    let foo = obj.maybeUndefined ?? "default value";
    

    JS treats 0, -0, null, false, NaN, undefined, or the empty string ("") as falsy。因此,在下面的示例中使用or 运算符设置默认值可能会导致意外结果

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

    这里,foo 等于 1,而实际上定义了 maybeUndefined。如果只有当maybeUndefined实际上是undefinednull时才应该为foo分配一个默认值,那么我们可以使用Nullish coalescing operator

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

    【讨论】:

      【解决方案2】:

      有了 ES2018,你现在可以写 options = { ...defaults, ...options }:

      Spread syntax - 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 }
      

      【讨论】:

      • 不知道为什么这被否决了。我给了 FWIW 一个 upvote
      【解决方案3】:

      看起来lodash 终于有了_.get() 功能!

      【讨论】:

        【解决方案4】:

        试试var options = extend(defaults, userOptions);

        通过这种方式,您可以获得所有 userOptions 并在它们未传递任何选项时回退到默认值。

        注意使用任何你想要的extend 实现。

        【讨论】:

        • extend 通常会修改并返回其第一个参数。这意味着您通常需要extend({}, defaults, userOptions),因此默认值不会更改。
        • 您的 extend 版本可能是不可变的,但我遇到的所有其他版本,包括来自 jQuery (api.jquery.com/jQuery.extend)、Lodash 和下划线 (underscorejs.org/#extend) 的版本都使用非- 不可变的形式。
        • 注意:也有快捷方式_.defaults 用于此目的。
        【解决方案5】:

        通常,当某些变量的计算结果为假时,可以使用or operator 分配默认值:

        var foo = couldBeUndefined || "some default";
        

        所以:

        var arg1 = config.args.arg1 || "test";
        var arg2 = config.args.arg2 || "param2";
        

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

        【讨论】:

        • 我相信如果 config.args.arg1 未定义会没问题,但如果 configconfig.args 本身未定义,这不会失败吗?
        • @karim79 他暗示config.args.arg1 将抛出config.args === undefined
        • 这里有一个很大的缺陷。如果couldBeUndefined = 0,或任何其他虚假值,则foo = "some default",而不是获得所需的foo = 0
        • 如果值为 false,这将失败。你应该这样做typeof x.y != 'undefined' ? x.y : "";
        • 当 arg 为布尔值且默认值为 true 时,一切都毁了。
        猜你喜欢
        • 1970-01-01
        • 2020-07-01
        • 2011-01-17
        • 1970-01-01
        • 2019-01-06
        • 1970-01-01
        • 2018-03-06
        • 2018-05-08
        • 2010-11-28
        相关资源
        最近更新 更多