關(guān)于JS的可選參數(shù),該知道的都在這里了

前言

我是一枚土生土長的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)在假想我們要將heightweight參數(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);

假如我是ageweight為可選參數(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;
}
// 效果和上面一致
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容