2017-02-23 130 views
6

這裏有一個空的對象分配的大括號對象是代碼,JS函數聲明:在參數聲明

export function createConnect({ 
    connectHOC = connectAdvanced, 
    mapStateToPropsFactories = defaultMapStateToPropsFactories, 
    mapDispatchToPropsFactories = defaultMapDispatchToPropsFactories, 
    mergePropsFactories = defaultMergePropsFactories, 
    selectorFactory = defaultSelectorFactory 
} = {}) {...} 

是什麼{connectHOC = connectAdvanced ...} = {}指的是函數參數聲明中?

我知道

= {} 

可能意味着功能參數的默認值,但什麼是對以前的括號中的代碼使用?

+2

我不能完全肯定的是,但是所述第一部分('{connectHOC = ......... = defaultSelectorFactory}')不是一個對象,它是與幾個變量聲明一個塊。一個對象會使用冒號,而不是等號。 –

+1

這是參數的默認值和解構的組合。讓我們感到驚訝的是,我們似乎並沒有在SO上同時覆蓋這兩個問題,無論是這次還是我的谷歌都在讓我失望。 –

+1

[This is close](http:// stackoverflow。com/questions/26578167/es6-object-destructuring-default-parameters),但不是很愚蠢。 [也是這個](http://stackoverflow.com/questions/34275971/how-to-destructure-option-argument-with-all-default-values-in-es6)。他們都解釋了這裏發生了什麼,但從OP的角度來看,他們知道他們希望將缺省值分配給解構參數,而不是「這是什麼語法」方法。 –

回答

5

這是ES2015語法。您的函數聲明將Destructuring assignment與默認值組合在一起。

這是使用對象的基本解構賦值:

var {a, b} = {a: "foo", b: "bar"}; 
 
console.log(a); // "foo" 
 
console.log(b); // "bar"

您可以添加默認值左側:

var {a = "foo", b = "bar"} = {}; 
 
console.log(a); // "foo" 
 
console.log(b); // "bar"

當你聲明一個函數時指定的參數,你不使用var,並與解構的對象將是相同的:

function test({a = "foo", b = "bar"}){ 
 
    console.log(a + b); 
 
} 
 
test({}); // "foobar" 
 
test({b: "boo"}); // "fooboo"

,當然,你可以定義默認值,這樣你的函數就不必接受任何參數。

function test({a = "foo", b = "bar"} = {}){ 
 
    console.log(a + b); 
 
} 
 
test(); // "foobar"

+0

不錯的其他例子。 – msanford

3

這只是使用解構來完成默認參數的方式。您需要按照您的建議默認最後一位。

考慮以下,其中,相同的例子使用一個destructuring assignment

function withDefault({parameter=something} = {}) { 
 
console.log(parameter) 
 
} 
 

 
let something = 1; 
 
withDefault();

與這一個,其中缺少缺省,並且引發一個錯誤:

function withoutDefault({parameter=something}) { 
 
console.log(parameter) 
 
} 
 

 
let something = 1; 
 
withoutDefault(); 
 
// It needs to be called as withoutDefault({}), withoutDefault(1) or 
 
// with some value, since the function signature doesn't define a default 
 
// in this case.