參數默認值可以與解構賦值的默認值,結合起來使用。
function foo({x, y = 5}) { //這裏定義了一個函數,參數爲一個{}對象,沒有默認值,只有解構賦值參數的默認值
console.log(x, y);
}
foo({}) // undefined 5
foo({x: 1}) // 1 5
foo({x: 1, y: 2}) // 1 2
foo() // TypeError: Cannot read property 'x' of undefined
上面代碼只使用了對象的解構賦值默認值,沒有使用函數參數的默認值。只有當函數foo
的參數是一個對象時,變量x
和y
纔會通過解構賦值生成。如果函數foo
調用時沒提供參數,變量x
和y
就不會生成,從而報錯。因此定義函數時,當與解構賦值結合使用時,參數默認值可以不設置,但是這時候調用函數時就必須要傳值,否則會報錯,因此只有進行了結構賦值這一步纔會去定義x和y
通過提供函數參數的默認值,就可以避免這種情況,如下:
function foo({x, y = 5}={}) {
console.log(x, y);
}
上面這個函數的情況是:
1 如果調用foo時沒傳參數,則默認是{},將{}值對左邊進行解構賦值,因爲y有默認值,則結果爲x:undefined,y:5
2 比如傳了值爲{x:10,y:20},那麼就使用這個對象對左邊進行解構賦值,匹配到了x和y,所以最終結果x=10,y=20;