2017-06-12 5 views
1

私はデフォルトのパラメータで少し錆びています。パラメータがデフォルト以外のパラメータの前にある場合、パラメータのデフォルト値を使用するにはどうすればいいですか?es6デフォルト以外のパラメータの前にあるデフォルトパラメータの使い方は?

以下のexample from Redux.jsでは、stateパラメータのデフォルト値{}はいつ有効ですか? (あなたは次のパラメータをデフォルトにすることはできないので)?パラメータがundefinedとき

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 
    } 
} 
+5

意味がありません。デフォルトのパラメータは最後に来る必要があります。そのため、コンパイルされた言語では、それも拒否されます。 – zerkms

+0

「*次のパラメータをデフォルトにする*」ことができないのはなぜですか? – RobG

+0

@RobG私はこの例を思いついたわけではありません。私はReduxチュートリアルのユースケースを理解しようとしています。 – tinlyx

答えて

1

問題での使用はredux.jsに固有のものです。最初のパラメータのデフォルト値は、デフォルト以外の2番目のパラメータがあるため、関数呼び出しでは通常役に立たない。

しかし、以前と同じチュートリアルabout Reducersで言ったように:

Reduxのは、最初 時間ため、未定義の状態で私たちの減速を呼び出します。これは我々のアプリの初期状態を返すように我々のチャンスです:

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

だから、第一パラメータは、実際にここでは省略されていません。 Reduxは初期化時にその値としてundefinedを供給しています。それは、この場合のみにショートカットとしてデフォルト引数の構文を使用チュートリアルです:

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

デフォルトが呼び出されます。

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

は、関数を呼び出すときにundefined秒を設定するための必要性を防ぐために、私は、デフォルト値を持つオブジェクトをdestructureすることを好みます。オブジェクトを使用すると、パラメータの順序は無関係になります。

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

2番目の提案はさらに悪化しています。 – zerkms

+0

タイプシステムは、おそらく悪いデザインについて叫んでいますが、修正する代わりに回避策を適用して、すべてが良いと思われます。 – zerkms

+0

これは1つの引数を関数に渡すだけではありませんか? – smac89

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); 
} 
0

私はJavaScriptにnewbeが、私は間違っていないよ場合は、デフォルトのパラメータは単に「未定義の」パラメータを交換してください。

私は、関数のように定義している場合:

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のフレームワークは、単に明示的に未定義渡さ。

関連する問題