【问题标题】:Shorthand to declare JavaScript variables / defaults?声明 JavaScript 变量/默认值的简写?
【发布时间】:2015-09-13 16:48:14
【问题描述】:

我有两种方法...一种基本上是第二种方法的重载或便利。如何轻松默认便捷方法的所有必需参数?

比如main方法是:

var doIt = function (item, varA, varB, varC, varD, callback) {
  // Lots of cool stuff in here... trust me.  ;-)
};

我希望我的便捷方法为“var”参数传入空值:

var doItNow = function (item, callback) {
  return doIt(item, null, null, null, null, callback);
};

但是,我不喜欢使用未命名的值。

我想做类似的事情:

var doItNow = function (item, callback) {
  var varA = varB = varC = varD = null;
  return doIt(item, varA, varB, varC, varD, callback);
};

...但是 WebStorm 告诉我这是一个禁忌。所以,我目前正在这样做:

var doItNow = function (item, callback) {
  var varA = null,
      varB = null,
      varC = null,
      varD = null;
  return doIt(item, varA, varB, varC, varD, callback);
};

这很好,但打字需要更长的时间。而且,当您编写大量代码时,这会变得更加乏味。

抱歉新手问题。提前谢谢。

【问题讨论】:

  • 也许更改doIt() 以接受具有属性的对象,这样您就不必填写您不想传递的属性名称。
  • @jfriend00 在评论中击败了我。在这种情况下,一个对象是你的朋友。

标签: javascript node.js


【解决方案1】:

我建议重组doIt() 以接受具有可选属性的对象,而不是一长串可选参数。当许多参数是可选的时,这是一种推荐的设计模式,并且它还可以更容易地传递一堆选项。而且,它为您提供了命名选项。然后你可以只传递你想传递的属性,而不需要很多额外的代码。

var doIt = function (item, options, callback) {
  // Lots of cool stuff in here... trust me.  ;-)
  if (options.opt1) {
     // ...
  }
};

var doItNow = function (item, callback) {
  return doIt(item, {}, callback);
};

【讨论】:

    【解决方案2】:

    您可以像这样在 ESCMA6 中设置可选参数:

    function doIt(varA = null) {
      // Bunnies
    }
    

    但在这完全实现之前,我想你可以传递一个数组来代替,你可以循环它以减少乏味:

    function doIt(item, myArray, callback) {
    
      var length = myArray.length,
          i;
    
      for (i = 0; i < length; i++) {
        myArray[i] = null;
      }
    }
    

    或者在 cmets 中提到的另一个选项是传入一个对象。

    【讨论】:

      【解决方案3】:

      但是,我不喜欢使用未命名的值。

      为什么不呢?它们毫无意义。为什么不能匿名?

      .. 但是 WebStorm 告诉我这是一个禁忌

      WebStorm 正确地抱怨该语法 (var x = y = null) 定义了一个全局变量。

      应该没问题

      var varA, varB, varC, varD;
      return doIt(item, varA, varB, varC, varD, callback);
      

      但是有什么意义呢?就我个人而言,我认为输入 null 可以完美地表达您正在做的事情,并且不会觉得输入所有这些 很乏味。如果它真的让你紧张,那么你可以考虑这个:

      var doItNow = function (item, callback) {
        return doIt.apply(null, [item, , , , callback]);
      };
      

      或者在 ES6 中

      var doItNow = function (item, callback) {
        return doIt(...[item, , , , callback]);
      };
      

      如果 JS 支持“空”参数就好了,比如 ion

      doIt(item, , , , callback)
      

      但事实并非如此。

      【讨论】:

        【解决方案4】:

        使用未命名的值是最好的方法。它的代码更少,更清晰,更高效。我强烈建议只使用您的示例中的空值:

        var doItNow = function (item, callback) {
          return doIt(item, null, null, null, null, callback);
        };
        

        另外,我想你的意思是

        var doItNow = function (item, callback) {
          var varA = null,
              varB = null,
              varC = null,
              varD = null;
          return doIt(item, varA, varB, varC, varD, callback);
        };
        

        而不是

        var doItNow = function (item, callback) {
              var varA = null,
                  varB = null,
                  varC = null,
                  varD = null;
              return doIt(item, null, null, null, null, callback); <-- Not using variables
            };
        

        【讨论】:

        • 第一个代码示例是为varBvarC 等创建隐式全局变量。不推荐。
        • 那么,现在你的答案是告诉 OP 使用他们说不想使用的结构?
        • 好吧,我真的没有理由不使用它。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多