函式的傳入參數預設值,在未指定實際的傳入值時,一定是 undefined,ES6 的函式預設參數允許沒有值傳入或是傳入值為 undefined 的情況下,參數能以指定的預設值初始化,指定不同的預設值可能在某些情況很管用。
在以前還沒有預設參數的時候,程式會以||
防呆,以免參數為 undefined。
1 | function foo(x, y){ |
這樣做的好處是,假設一開始的 x 與 y 參數沒有傳入值,利用||
可將預設值 15 與 3 帶入,而不致於變成 undefined。但這樣做會有一個陷阱,假設我們傳給參數的值是 falsy 的,你的程式有可能會跟你想得不一樣。
1 | function foo(x, y){ |
假設你希望的結果是 0 + 8,那你的程式就出包了,因為 0 在||
旁被視為 falsy,所以你的 x 被自動帶入 15,變成 15 + 3。為了消除這種陷阱,有些人會用嚴格相等式測試帶入的參數是不是 undefined:1
2
3
4
5
6function foo(x, y){
x = (x !== undefined) ? x : 15
y = (y !== undefined) ? y : 3
console.log(x + y)
}
foo(0, 8) //8
但現在我們可以直接在參數就把預設值帶入,這樣使得我們的防呆機制變得更簡潔。
1 | function foo(x = 15, y = 3){ |
參數預設值的規則是如果函數呼叫時本來就有值,這裡的值不限於原始資料值,也可用表達式、陣列、物件、函式與 this,甚至連 null 與空字串都包括在內,參數預設值就會自動忽略。
反之,如果該引入的參數沒有值或是 undefined,參數就會以預設值帶入。
1 | function log(x, y = 'World') { |
1 | function multiply(a, b = 1) { |
1 | const link = function (point = 10, url = 'http://google.com') { |
參數預設值不能用let
或const
再次宣告。
1 | function foo(x = 5) { |
使用參數預設值時,函數不能有同名參數。
1 | // 不會報錯 |
預設參數值的位置
預設參數值並沒有限定位置,但在 airbnb 的規範裡表明,有預設值的參數,應該要放在沒有預設值的參數後面,這樣會讓有預設值的參數一目瞭然,比較不容易出錯。1
2
3
4
5
6
7
8
9// 壞寫法
function handleThings(opts = {}, name) {
// ...
}
// 好寫法
function handleThings(name, opts = {}) {
// ...
}
與箭頭函式的搭配
箭頭函式也可帶入參數預設值,需要注意的是,假設你的箭頭函式只有一個參數時,加上參數預設值,必須加上圓括號。
1 | const add = (x = 1) => x + 2 |
參考連結:
React 16 - The Complete Guide
React - DOM界的彼方(繁中)
MDN - 預設參數
ECMAScript 6 入门
你所不知道的JS:ES6與未來發展