亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

深入學習JavaScript中的Rest參數和參數默認值

2019-11-20 11:58:39
字體:
來源:轉載
供稿:網友

本文將討論使 JavaScript 函數更有表現力的兩個特性:Rest 參數和參數默認值。
Rest 參數

通常,我們需要創建一個可變參數的函數,可變參數是指函數可以接受任意數量的參數。例如,String.prototype.concat 可以接受任何數量的字符串作為參數。使用 Rest 參數,ES6 為我們提供一種新的方式來創建可變參數的函數。

我們來實現一個示例函數 containsAll,用于檢查一個字符串中是否包含某些子字符串。例如,containsAll("banana", "b", "nan") 將返回true,containsAll("banana", "c", "nan") 將返回 false。

下面是傳統的實現方式:

function containsAll(haystack) { for (var i = 1; i < arguments.length; i++) {  var needle = arguments[i];  if (haystack.indexOf(needle) === -1) {   return false;  } } return true;} function containsAll(haystack) { for (var i = 1; i < arguments.length; i++) {  var needle = arguments[i];  if (haystack.indexOf(needle) === -1) {   return false;  } } return true;}

該實現用到了 arguments 對象,該對象是一個類數組對象,包含函數被調用時的實參列表。這段代碼正是我們想要的,但其可讀性卻不是最優的。函數只有一個形參 haystack,所以不可能一看就知道該函數需要多個參數,并且在遍歷 arguments 時,需要特別注意遍歷的開始索引為1 ,而不是常見的 0,因為 arguments[0] 就是函數定義時的形參 haystack。如果我們想在 haystack 參數之前或之后添加一些參數,我們不得不更新內部的循環。Rest 參數解決了這些問題,下面是 使用 Rest 參數的實現方式:

function containsAll(haystack, ...needles) { for (var needle of needles) {  if (haystack.indexOf(needle) === -1) {   return false;  } } return true;} function containsAll(haystack, ...needles) { for (var needle of needles) {  if (haystack.indexOf(needle) === -1) {   return false;  } } return true;}

以上兩個實現都滿足了我們的需求,但后者包含一個特殊的 ...needles 語法。我們來看看調用containsAll("banana", "b", "nan") 時的細節,參數 haystack 和以往一樣,將用函數的第一個實參填充,值為 "banana",needles 前面的省略號表示它是一個 Rest 參數,剩余的所有實參將被放入一個數組中,并將該數組賦給 needles 遍量。在這個調用中,needles 的值為 ["b", "nan"]。然后,就是正常的函數執行了。

只能將函數的最后一個函數作為 Rest 參數,在函數被調用時,Rest 參數之前的參數都將被正常填充,之外的參數將被放入一個數組中,并將該數組作為 Rest 參數的值,如果沒有更多的參數,那么 Rest 參數的值為一個空數組 [],Rest 參數的值永遠都不會是 undefined。
參數的默認值

通常,調用一個函數時,不需要調用者傳遞所有可能的參數,那些沒有傳遞的參數都需要一個合理的默認值。JavaScript 對那些沒有傳遞的參數都有一個固定的默認值 undefined。在 ES6 中,引入了一種新方法來指定任意參數的默認值。

看下面例子:

function animalSentence(animals2="tigers", animals3="bears") {  return `Lions and ${animals2} and ${animals3}! Oh my!`;} function animalSentence(animals2="tigers", animals3="bears") {  return `Lions and ${animals2} and ${animals3}! Oh my!`;}

在每個參數的 = 后面是一個表達式,指定了參數未傳遞時的默認值。所以,animalSentence() 返回 "Lions and tigers and bears! Oh my!", animalSentence("elephants") 返回"Lions and elephants and bears! Oh my!", animalSentence("elephants", "whales") 返回 "Lions and elephants and whales! Oh my!"。

參數默認值需要注意的幾個細節:

    與 Python 不一樣的是,參數默認值的表達式是在函數調用時從左到右計算的,這意味著表達式可以使用前面已經被填充的參數。例如,我們可以將上面的函數變得更有趣一點:

function animalSentenceFancy(animals2="tigers",  animals3=(animals2 == "bears") ? "sealions" : "bears"){ return `Lions and ${animals2} and ${animals3}! Oh my!`;} function animalSentenceFancy(animals2="tigers",  animals3=(animals2 == "bears") ? "sealions" : "bears"){ return `Lions and ${animals2} and ${animals3}! Oh my!`;}

那么,animalSentenceFancy("bears") 將返回 "Lions and bears and sealions. Oh my!"。

    傳遞 undefined 等同于沒有傳遞該參數。因此,animalSentence(undefined, "unicorns") 將返回 "Lions and tigers and unicorns! Oh my!"。
    如果沒有為一個參數指定默認值,那么該參數的默認值為 undefined,所以

function myFunc(a=42, b) {...} function myFunc(a=42, b) {...}

等同于

function myFunc(a=42, b=undefined) {...} function myFunc(a=42, b=undefined) {...}

拋棄 arguments

通過 Rest 參數和參數的默認值,我們可以完全拋棄 arguments 對象,使我們的代碼可讀性更高。此外,arguments 對象也加深了優化 JavaScript 的難題。

希望以上兩個新特性可以完全取代 arguments。作為第一步,在使用 Rest 參數或參數的默認值時,請避免使用 arguments 對象,假如 arguments 對象還不會立即被移除,或者永遠不會,那么也最好是避免在使用 Rest 參數或參數默認值時使用 arguments 對象。
兼容性

Firefox 15 以上的版本已經支持這兩個新特性。然而,除此之外,還沒有其他任何瀏覽器支持。最近,V8 的實驗環境添加了對 Rest 參數的支持,而參數默認值還有一個 issue,JSC 也對 Rest 參數和參數默認值提了一些 issue。

Babel 和 Traceur 這兩個編譯器都已經支持了參數默認值,所以你可以大膽使用。
結論

盡管從技術層面上看,這兩個新特性在并沒有給函數引入新的行為,但它們可以使一些函數的聲明更具表現力和可讀性。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
午夜精品久久17c| 精品久久久久久久久久久| 92看片淫黄大片看国产片| 国产美女扒开尿口久久久| 亚洲精品一二区| 精品久久久av| 最近中文字幕日韩精品| 成人欧美一区二区三区黑人孕妇| 5566日本婷婷色中文字幕97| 亚洲精品免费av| 日韩亚洲综合在线| 日韩精品在线视频美女| 亚洲人成网站在线播| 午夜免费在线观看精品视频| 在线观看日韩专区| 国产日产欧美精品| 色综合色综合久久综合频道88| 欧美激情在线观看| 亚洲人成电影在线播放| 欧美日韩亚洲视频| 97国产精品免费视频| 在线视频一区二区| 日韩精品亚洲视频| 精品福利在线视频| 欧美日韩午夜视频在线观看| 97婷婷涩涩精品一区| 中文字幕亚洲国产| 日韩在线观看网站| 欧美成人精品三级在线观看| 98午夜经典影视| 亚洲精品久久在线| 国产a∨精品一区二区三区不卡| 亚洲人成网7777777国产| 久久久免费精品| 亚洲天堂视频在线观看| 国产精品久在线观看| 国产精品电影网| 草民午夜欧美限制a级福利片| 热久久视久久精品18亚洲精品| 国产精品va在线播放| 亚洲国模精品一区| www.欧美免费| 欧美性猛交丰臀xxxxx网站| 久久精品久久久久久| 国产亚洲精品91在线| 久久久精品999| 国产精品福利在线观看| 久久香蕉精品香蕉| 精品国产一区二区三区久久狼黑人| 亚洲视频综合网| 久久精品视频一| 日韩av综合网站| 国产91精品久久久久久| 欧美日韩在线视频一区| 成人欧美在线观看| 午夜精品一区二区三区在线视频| 2019最新中文字幕| 国产精品男人爽免费视频1| 亚洲美女又黄又爽在线观看| 国产精品久久久久久搜索| 最近中文字幕日韩精品| 中文欧美日本在线资源| 久久国产色av| 91精品国产综合久久久久久久久| 亚洲色图日韩av| 91在线无精精品一区二区| 中文字幕亚洲二区| 国产精品小说在线| 欧美日韩在线免费观看| 国产精品久久99久久| 日韩电影免费在线观看中文字幕| 好吊成人免视频| 国产精品福利网| 91久久精品一区| 久久色免费在线视频| 欧美日韩国产影院| 91视频国产一区| 国产噜噜噜噜噜久久久久久久久| 在线播放国产一区中文字幕剧情欧美| 国产日韩欧美在线观看| 精品国产91久久久久久老师| 日本精品一区二区三区在线播放视频| 在线观看视频99| 国产精品久久久久久久久久尿| 亚洲理论在线a中文字幕| 精品一区二区三区四区在线| 久久高清视频免费| 久久99热这里只有精品国产| 亚洲精品一区中文字幕乱码| 亚洲欧美在线磁力| 久久精品视频导航| 欧洲一区二区视频| 九九热精品在线| 中文字幕欧美精品在线| 欧美亚洲成人免费| 日韩精品视频三区| 国语自产精品视频在线看一大j8| 在线观看欧美www| 黄色成人av在线| 欧美丰满少妇xxxxx| 久久久在线视频| 欧美xxxx做受欧美.88| 国产精品亚洲一区二区三区| 欧美亚洲激情视频| 亚洲国产精品va在看黑人| 日韩成人免费视频| 亚洲欧美日本另类| 欧美日韩国产一区二区| 成人xxxx视频| 亚洲天堂男人天堂女人天堂| 成人动漫网站在线观看| 亚洲自拍偷拍在线| 欧美亚洲日本网站| 亚洲男人的天堂网站| 国产成人涩涩涩视频在线观看| 最新国产精品亚洲| 综合欧美国产视频二区| 18一19gay欧美视频网站| 亚洲精品少妇网址| 亚洲欧美国产视频| 亚洲天堂免费在线| 国产精品视频免费在线| 国产成人精品网站| 亚洲风情亚aⅴ在线发布| 国产成人精品久久久| 国产精品精品一区二区三区午夜版| 日韩精品免费观看| www欧美xxxx| 久久人91精品久久久久久不卡| 久久成人精品一区二区三区| 国产精品第三页| 欧美成人精品激情在线观看| 国产成人精品免费久久久久| 亚洲国产精品久久久久久| 亚洲人av在线影院| 国产精品免费久久久久影院| 亚洲精品国产精品国自产在线| 亚洲精品720p| 日韩视频免费大全中文字幕| 96国产粉嫩美女| 欧美专区在线视频| 亚洲第一二三四五区| 国产精品三级美女白浆呻吟| 欧美激情精品久久久久久久变态| 欧美日韩在线视频一区| 亚洲欧美日本精品| 91极品视频在线| 国产精品色视频| 亚洲人成在线播放| 欧美国产精品va在线观看| 国产中文欧美精品| 中文在线资源观看视频网站免费不卡| 国模极品一区二区三区| 精品小视频在线| 成人亲热视频网站| 久热精品视频在线免费观看| 亚洲午夜国产成人av电影男同| 亚洲精品在线观看www| 北条麻妃久久精品| 欧美性猛交xxxx偷拍洗澡| 91情侣偷在线精品国产| 欧美日韩中文字幕| 在线观看91久久久久久| 国产精品h在线观看|