允许在Javascript中使用命名参数或位置参数

时间:2015-12-17 06:17:44

标签: javascript parameter-passing ecmascript-6

如何让函数接受 命名参数(file_open位置参数(foo({a: 'hello', b: 'it is me'}))?

我知道可以通过将对象传递给函数来模拟命名参数:

foo('hello', 'it is me')

但这不允许我接受传递的位置参数。

我想使用ES6,但是ES5的任何东西都可以。

3 个答案:

答案 0 :(得分:1)

我认为这样的事情会起作用:

function foo(...options){
   if (typeof options[0] === 'object'){
    console.log('expect object', options[0]);
  }else{
    console.log('expect array', options);  
  }
}

foo('peanut', 'butter');
foo({a:'peanut', b:'butter'});

答案 1 :(得分:1)

首先,我真的建议坚持使用一个appraoch。如你所说,使用 "命名为"

function foo({a = 'peanut', b = 'butter'} = {}) {
    console.log(a, b);
}

位置参数:

function foo(a = 'peanut', b = 'butter') {
    console.log(a, b);
}

选择最适合您功能的不要混合

如果您出于某种原因确实需要两者,standard overloading techniques可供您使用。只有当您的第一个位置参数不是对象时,它才能正常工作。我会提出以下习语之一:

function foo(a, b) { // positional is normal case
    if (arguments.length == 1 && typeof arguments[0] == "object")
        {a, b} = arguments[0];

    console.log(a, b);
}

function foo({a, b}) { // named is normal case
    if (arguments.length > 1 || typeof arguments[0] != "object")
        [a, b] = arguments;

    console.log(a, b);
}

如果你需要默认值,它会变得丑陋:

function foo(a, b) {
    var opts = (arguments.length == 1 && typeof arguments[0] == "object")
      ? arguments[0]
      : {a, b};
    ({a = 'peanut', b = 'butter'} = opts);

    console.log(a, b);
}

答案 2 :(得分:0)

我认为没有为此内置的内容,但此代码适用于您的情况

function foo({a = 'peanut', b = 'butter'} = {}) {
    if (typeof arguments[0] === 'string') {
        return foo({a: arguments[0], b: arguments[1]})
    }
    console.log(a, b);
}