繁体   English   中英

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

[英]es6 how to use default parameters that go before non-default parameters?

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

在下面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
  }
}

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

但是,正如之前在同一个关于Reducers的教程中所说:

Redux将首次调用我们的减速器处于未定义状态 这是我们返回应用程序初始状态的机会:

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

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

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

参数undefined时调用默认值:

todo(undefined, { type: 'WHATEVER' });

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

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

默认参数必须到最后我不认为有一个直接的方法让它们来到其他参数之前,但你可以使用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);
}

我是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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM