跳过函数参数的任何更短的方法都比写出undefined?

时间:2016-09-24 03:50:08

标签: javascript

说我有这个

function isdef(x) { return typeof x !== 'undefined'; }

function banana(a, b, c) {
    if (!isdef(a)) a = 1;
    if (!isdef(b)) b = 2;
    if (!isdef(c)) c = 3;
    ...
}

所以所有参数都是可选的。如果我想用c参数调用它,我必须写

banana(undefined, undefined, 5);

这有点笨重。

当然,我可以做类似

的事情
window.k = undefined;
...
banana(k, k, 5);

但我真的不想制作短窗口范围变量。

例如在vb.net中,我可以写

banana(,,5)

但是js并不喜欢这样。

有没有一种方便的方法可以跳过函数调用中的参数?

5 个答案:

答案 0 :(得分:2)

你可以传递一个对象

function banana(options) {
     if (!isdef(options.a)) a = 1;
     if (!isdef(options.b)) b = 1;
}

banana({a:1});

答案 1 :(得分:1)

我认为在JavaScript中没有办法只能在不传递第一个参数的情况下提供后面的参数。而且我不确定你的要求。但这是我的方法。请随时回复。

function banana(bananaObj){
  bananaObj = bananaObj || {};
  bananaObj.a = bananaObj.a || 1;
  bananaObj.b = bananaObj.b || 2;
  bananaObj.c = bananaObj.c || 3;
  document.write('bananaObj: ', JSON.stringify(bananaObj));
}
banana({c:10})

答案 2 :(得分:1)

  

是否有方便的方法在函数调用中跳过参数?

不直接。

ES Discuss mailing group讨论了这个主题。至少可以说,对该提案的接受是冷淡的。还建议在函数定义中使参数可选:

function foo(a, , b) { }

您的选择包括:

  1. 使用spread syntax如下:

    banana(...[,,5])
    
  2. 重新排序参数以将可选参数放在最后。

  3. 编写一个higher-level function转换函数以添加其他主要参数:

    function prefixArgs(fn, n) {
      return function(...args) { 
        return fn(...Array(n), ...args); 
      };
    }
    
    prefixArgs(banana, 2)(5)
    
  4. 使用对象而不是参数列表,如其他答案所示。

  5. Curry”函数,如

    function banana(a = 1) {
      return function(b = 2) {
        return function(c = 3) {
          return SOMETHING-USING-A-B-AND-C;
        };
      };
    }
    
    banana()()(5)
    
  6. 请注意,在上面我使用了parameter defaults。它们是您为undefined编写的检查的一个很好的替代方法:

    function banana(a = 1, b = 2, c = 3) {
      ...
    }
    

    虽然这本身并不能解决如何传入引导可选参数的问题。您可以将此banana的实现与上述一些想法结合使用。

    <强>支持即可。请注意,扩展参数和参数默认值是ES6功能。如果你不熟悉它们,你应该开始学习它们。如果您需要针对IE本身不支持它们的浏览器,那么您需要使用Babel等知名工具进行转换。

答案 3 :(得分:0)

您可以先声明必需的参数,然后以这种方式后跟可选参数:

function banana(a, b, c) {
    b = b || 0;
    c = c || 0;
    // a is required, b and c is optional, either b or 0
}

调用省略banana(1)b的函数c,或提供所有参数banana(1, 2, 3)

另一种方法是声明对象的参数,这样就不需要记住参数的顺序或数量了。

function banana(args) {
    // set defaults
    args.a = args.a || 0;    
    args.b = args.b || 0;
    args.c = args.c || 0;
}

调用函数banana({ a: 1, b: 2 })

答案 4 :(得分:0)

您可以使用 public static class Seanger extends Musiker { ... rest parameter,括号表示法。如果要返回所有变量,则传递索引以选择Array.prototype.map()banana作为第一个参数

&#13;
&#13;
null
&#13;
&#13;
&#13;