es6如何使用非默认参数之前的默认参数?

时间:2017-06-12 04:42:36

标签: javascript ecmascript-6 default-value

我对默认参数有点生疏,我想知道如果参数没有默认参数,我怎么能使用参数的默认值?

在下面的example from Redux.js中,{}参数的默认值state何时有用? (因为你不能默认下一个参数)?

const todo = (state = {}, action) => {
  switch (action.type) {
    //...

    case 'TOGGLE_TODO':
      if (state.id !== action.id) {
        return state
      }

      return Object.assign({}, state, {
        completed: !state.completed
      })

    default:
      return state
  }
}

4 个答案:

答案 0 :(得分:6)

有问题的用法特定于redux.js。第一个参数的默认值在函数调用中通常是无用的,因为第二个参数没有默认值。

但是,正如之前在同一教程about Reducers中所说的那样:

  

Redux将为我们的reducer调用第一个未定义的状态   时间即可。这是我们返回应用程序初始状态的机会:

function todoApp(state, action) {
  if (typeof state === 'undefined') {
    return initialState
  }
  //...
  return state
}

所以这里没有真正省略第一个参数。 Redux在初始化时提供undefined作为其值。只有在这种情况下,教程才使用默认参数语法作为快捷方式:

function todoApp(state = initialState, action) {
  //...
  return state
}

答案 1 :(得分:2)

当参数为undefined

时,将调用默认值
todo(undefined, { type: 'WHATEVER' });

为了防止在调用函数时需要设置undefined,我更喜欢使用默认值来构造对象。使用对象使params的顺序无关紧要。

todo({ state = {}, action } = {}) => {};

答案 2 :(得分:0)

默认参数必须到最后我不认为有一种直接的方法可以让它们在其他参数之前出现,但是你可以使用Arguments Object来实现这样的效果。

例如

function myFunction(){
  var firstParam , secondParam;
  if(arguments.length === 0){
     console.log("no input");
     return;
  }
  if(arguments.length === 1){
    secondParam =  arguments[0];
  }
  else{
    firstParam  =  arguments[0];
    secondParam =  arguments[1];
  }
   // you can write any logic above
   // also you can give params in function definition as well myFunction(firstParam , secondParam)
   // use params as you wish
  console.log(firstParam);
  console.log(secondParam);
}

答案 3 :(得分:0)

我是javascript的新手,但如果我没有弄错,默认参数只是替换'undefined'参数。

如果我将函数定义为:

function example(var1 = false, var2, var3 = false) ...

这意味着以下来电都是合法的:

example(true, someVar, true);
example(true, someVar); // calls  example(true, someVar, false)
example(undefined, someVar, true); // calls example(false, someVar, true)
example(undefined, someVar); // calls example(false, someVar, true)

redux框架只是明确地传递了undefined。