有如下函數:
function write(a,b){ console.log(a,b); }
此函數包涵有兩參數,分別是a,b
調用方式如下:
write("girl","boy");
當調用方法,參數不傳值時則會打印undefined
如果我們想要不傳參數也能打印一個默認值-----“boy”,即讓參數有一個默認值。
首先我想到的是用三目運算符和短路運算符邏輯或(||)
方法如下:
function write(a,b){ b=b?b:"boy"; //b=b||"boy" console.log(a,b); }
如此問題解決,讓我們來試試

沒有問題,再來試試特殊情況空‘ ’
write('girl','')
預期結果:girl

不妙,得到的結果是居然是girl boy。(我不想給girl匹配對象的啊,旁邊的空位應該給“我”留着)
算了,還是來分析分析原因吧,我們用的是三目運算符或短路運算符,這二者都是依據布爾值進行判斷的,空字符串對應的布爾值是false,故這里b值最終都會被賦值為“body”
好吧,既然如此。再繼續想想着。
如果一個函數的參數沒有傳值,那么這個參數的值就是沒有初始化的,那么它就是“undefind”(基本數據類型之一),如此我可以直接判斷參數是否傳值。改寫后的代碼如下:
function write(a,b){ if(typeof b==='undefined'){ b='boy' } console.log(a,b); } write('girl',);
繼續進行探索下,以上的方法是在es5中被想到的為函數設置默認參數的辦法。雖然實現了目的,但這種方法總還是欠缺了些許“優雅”。代碼的可閱讀性和簡潔性都不是太好,在一大段代碼中想要一眼找出函數是否帶有默認參數還是有點麻煩的。
為函數設置默認參數的做法是較為常用的一種場景,因此ES6中新增了一個特性來解決。在ES6中寫帶默認參數的函數方式如下:
function write(a,b='boy'){ console.log(a,b); } write('girl',);
這就簡潔很多了,這才是優雅的實現。
