【问题标题】:javascript defaults/fallbacks shorter solutionjavascript defaults/fallbacks 更短的解决方案
【发布时间】:2017-01-23 09:26:19
【问题描述】:

我在我的 javascript 中使用选项,如果它不存在,它会回退到默认值:

var tabActive = typeof data.tabActive !== 'undefined' ? data.tabActive : 'active';
var paneActive = typeof data.paneActive !== 'undefined' ? data.paneActive : 'active';

但是,有很多这样的行感觉有点凌乱/臃肿。是否可以通过辅助函数使其更智能。

这样的?

function option(key, value) {
  return 'Something';
}

【问题讨论】:

  • 你也可以使用var tabActive = data.tabActive || 'active';
  • data.tabActive 有什么价值?只是undefined 还是一个字符串?

标签: javascript undefined typeof


【解决方案1】:

如果可以将任何虚假值视为undefined,您可以使用功能强大的|| 运算符:

var tabActive = data.tabActive || 'active';
var paneActive = data.paneActive || 'active';

...但是不是如果"" 是您想要转换为"active" 的有效值,因为"" 是虚假值(虚假值的完整列表是0NaNnullundefined"",当然还有false)。

【讨论】:

    【解决方案2】:

    您可以包装该部分以签入函数。

    function option(key, value) {
        return typeof data[key] !== 'undefined' ? data[key] : value;
    }
    

    对于falsy values,如undefinednull'',您可以使用逻辑或||。这将返回给定的value

    function option(key, value) {
        return data[key] || value;
    }
    

    【讨论】:

    • 我喜欢你的想法,但是“数据”是一个外部引用,你应该重构这个函数来实现任何对象。数据应该是一个参数,或者你应该创建一个自己的对象引用,如 this
    • @AndreCanilho,这取决于。如果函数在作用域内,那么它可以工作。
    • 您对此可能都是正确的。在我的情况下,数据是 javascript 模块内部的全局数据。我还没有尝试过,但我想这段代码将适用于我的情况。
    • @NinaScholz 是的,但是每次您需要该功能时,都必须在范围内重新定义它。这没有错,但这是一个糟糕的编程习惯。如果您有一个可以随时访问的默认“检查”,您只需定义一次,并在需要时调用它。
    • @AndreCanilho,我看到一小段代码,而不是整个代码。你是对的不要重复自己
    【解决方案3】:

    Nina 解决方案的另一种选择。请注意,我将对象 obj 作为参数传递,或者您也可以将此函数定义为对象 data 的属性。

    function testProp(obj, prop, val){
    if(typeof obj !== 'undefined' && obj.hasOwnProperty(prop)){
        obj[prop] = val;
    }
    }
    

    如何调用函数: testProp(data, 'tabActive', 'active');

    【讨论】:

      猜你喜欢
      • 2012-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多