前言
我是一枚土生土長的iOS程序猿,之所以會寫關(guān)于JS的文章,主要是因為我最近在負責(zé)組里的部分運營需求,所以寫前端也逐漸比較多,于是乎學(xué)習(xí)JS勢在必行,所以就開寫了。
正文
我們都知道函數(shù)是js里的一等公民,并且在js里,你聲明一個函數(shù)——你可以定制多個參數(shù),與此同時,你在調(diào)用該函數(shù)的時候不需要傳入所有的參數(shù),它就能正常執(zhí)行——只不過這些參數(shù)默認就是undefined而已。所以似乎js的函數(shù)天生就帶有可選參數(shù)這個功能,只不過在你不進行定制的時候它們都具有一個“統(tǒng)一”的值罷了。
所以,我們也知道,除非函數(shù)里就實現(xiàn)了針對某個參數(shù)為undefined時的行為,讓參數(shù)為undefined是比較危險的。
該如何實現(xiàn)函數(shù)內(nèi)的可選參數(shù),我們將用js里的構(gòu)造方法來舉例(假如我們要實現(xiàn)一個Person類):
function Person(name, age, height, weight) {
this.name = name;
this.age = age;
this.height = height;
this.weight = weight;
}
通常我們都會這么實現(xiàn),現(xiàn)在假想我們要將height和weight參數(shù)設(shè)為可選參數(shù),可選參數(shù)的實質(zhì)就是令未被賦值的參數(shù)具有一個默認值,直白地處理,我們可以寫成這樣:
function Person(name, age, height, weight) {
var nHeight = height || 0;
var nWeight = weight || 0;
this.name = name;
this.age = age;
this.height = nHeight ;
this.weight = nWeight ;
}
但是因為我們這里的參數(shù)只是簡單的賦值給屬性,所以我們可以這么寫:
function Person(name, age, height, weight) {
this.name = name;
this.age = age;
this.height = height || 0;
this.weight = weight || 0;
}
面對這樣的實現(xiàn),不難發(fā)現(xiàn)它還有點問題——這種實現(xiàn)永遠只能把可選參數(shù)連續(xù)地聲明在函數(shù)的末端,必要的參數(shù)必須得放前面,因為它只能這樣生成:
var person = new Person("Turtle", 23);
假如我是age和weight為可選參數(shù)呢?
function Person(name, age, height, weight) {
this.name = name;
this.age = age || 0;
this.height = height;
this.weight = weight || 0;
}
// 我就不能這樣生成Person對象了
var person = new Person("Turtle", "170cm");
因為這樣子賦值,沒法讓170cm賦到height屬性上,只會賦到age屬性上,這顯然不是我們想要的。
一種簡便的解決方法是不定義這么多的參數(shù)賦值,而統(tǒng)一使用一個對象來進行賦值:
function Person(options) {
this.name = options.name;
this.age = options.age || 0;
this.height = options.height;
this.weight = options.weight || 0;
}
var options = {
name: "Turtle",
height: "170cm",
};
var person = new Person(options);
//or
var person2 = new Person({
name: "Turtle",
height: "170cm",
});
而在es6里,它支持了為參數(shù)提供默認值,所以你可以這么干:
function Person({name, age = 0, height, weight = 0} = {}) {
this.name = name;
this.age = age;
this.height = height;
this.weight = weight;
}
// 效果和上面一致