成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

ES6:Rest 參數(shù)和參數(shù)默認(rèn)值【轉(zhuǎn)】

wanglu1209 / 2276人閱讀

摘要:在中,引入了一種新方法來(lái)指定任意參數(shù)的默認(rèn)值??聪旅胬釉诿總€(gè)參數(shù)的后面是一個(gè)表達(dá)式,指定了參數(shù)未傳遞時(shí)的默認(rèn)值。如果沒(méi)有為一個(gè)參數(shù)指定默認(rèn)值,那么該參數(shù)的默認(rèn)值為,所以等同于原文鏈接

Rest 參數(shù)

通常,我們需要?jiǎng)?chuàng)建一個(gè)可變參數(shù)的函數(shù),可變參數(shù)是指函數(shù)可以接受任意數(shù)量的參數(shù)。例如,String.prototype.concat 可以接受任何數(shù)量的字符串作為參數(shù)。使用 Rest 參數(shù),ES6 為我們提供一種新的方式來(lái)創(chuàng)建可變參數(shù)的函數(shù)。
我們來(lái)實(shí)現(xiàn)一個(gè)示例函數(shù) containsAll,用于檢查一個(gè)字符串中是否包含某些子字符串。例如,containsAll("banana", "b", "nan") 將返回true,containsAll("banana", "c", "nan") 將返回 false。
下面是傳統(tǒng)的實(shí)現(xiàn)方式:

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

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

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

以上兩個(gè)實(shí)現(xiàn)都滿足了我們的需求,但后者包含一個(gè)特殊的 ...needles 語(yǔ)法。我們來(lái)看看調(diào)用 containsAll("banana", "b", "nan") 時(shí)的細(xì)節(jié),參數(shù) haystack 和以往一樣,將用函數(shù)的第一個(gè)實(shí)參填充,值為 "banana",needles 前面的省略號(hào)表示它是一個(gè) Rest 參數(shù),剩余的所有實(shí)參將被放入一個(gè)數(shù)組中,并將該數(shù)組賦給 needles 遍量。在這個(gè)調(diào)用中,needles 的值為 ["b", "nan"]。然后,就是正常的函數(shù)執(zhí)行了。
只能將函數(shù)的最后一個(gè)函數(shù)作為 Rest 參數(shù),在函數(shù)被調(diào)用時(shí),Rest 參數(shù)之前的參數(shù)都將被正常填充,之外的參數(shù)將被放入一個(gè)數(shù)組中,并將該數(shù)組作為 Rest 參數(shù)的值,如果沒(méi)有更多的參數(shù),那么 Rest 參數(shù)的值為一個(gè)空數(shù)組 [],Rest 參數(shù)的值永遠(yuǎn)都不會(huì)是 undefined。

實(shí)現(xiàn)Rest參數(shù)的函數(shù) restArgs

var restArgs = function (func, startIndex) {
    // rest參數(shù)從哪里開(kāi)始,如果沒(méi)有,則默認(rèn)視函數(shù)最后一個(gè)參數(shù)為rest參數(shù)
    // 注意, 函數(shù)對(duì)象的length屬性, 揭示了函數(shù)的參數(shù)個(gè)數(shù)
    /*
     ex: function add(a,b) {return a+b;}
     console.log(add.length;) // 2
     */
    startIndex = startIndex == null ? func.length - 1 : +startIndex;
    // 返回一個(gè)支持rest參數(shù)的函數(shù)
    return function () {
        // 校正參數(shù), 以免出現(xiàn)負(fù)值情況
        var length = Math.max(arguments.length - startIndex, 0);
        // 為rest參數(shù)開(kāi)辟數(shù)組存放
        var rest = Array(length);
        // 假設(shè)參數(shù)從2個(gè)開(kāi)始: func(a,b,*rest)
        // 調(diào)用: func(1,2,3,4,5); 實(shí)際的調(diào)用是:func.call(this, 1,2, [3,4,5]);
        for (var index = 0; index < length; index++) {
            rest[index] = arguments[index + startIndex];
        }
        // 根據(jù)rest參數(shù)不同, 分情況調(diào)用函數(shù), 需要注意的是, rest參數(shù)總是最后一個(gè)參數(shù), 否則會(huì)有歧義
        switch (startIndex) {
            case 0:
                // call的參數(shù)一個(gè)個(gè)傳
                return func.call(this, rest);
            case 1:
                return func.call(this, arguments[0], rest);
            case 2:
                return func.call(this, arguments[0], arguments[1], rest);
        }
        // 如果不是上面三種情況, 而是更通用的(應(yīng)該是作者寫(xiě)著寫(xiě)著發(fā)現(xiàn)這個(gè)switch case可能越寫(xiě)越長(zhǎng), 就用了apply)
        var args = Array(startIndex + 1);
        // 先拿到前面參數(shù)
        for (index = 0; index < startIndex; index++) {
            args[index] = arguments[index];
        }
        // 拼接上剩余參數(shù)
        args[startIndex] = rest;
        return func.apply(this, args);
    };
};
參數(shù)的默認(rèn)值

通常,調(diào)用一個(gè)函數(shù)時(shí),不需要調(diào)用者傳遞所有可能的參數(shù),那些沒(méi)有傳遞的參數(shù)都需要一個(gè)合理的默認(rèn)值。JavaScript 對(duì)那些沒(méi)有傳遞的參數(shù)都有一個(gè)固定的默認(rèn)值 undefined。在 ES6 中,引入了一種新方法來(lái)指定任意參數(shù)的默認(rèn)值。
看下面例子:

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

在每個(gè)參數(shù)的 = 后面是一個(gè)表達(dá)式,指定了參數(shù)未傳遞時(shí)的默認(rèn)值。所以,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!"。
參數(shù)默認(rèn)值需要注意的幾個(gè)細(xì)節(jié):與 Python 不一樣的是,參數(shù)默認(rèn)值的表達(dá)式是在函數(shù)調(diào)用時(shí)從左到右計(jì)算的,這意味著表達(dá)式可以使用前面已經(jīng)被填充的參數(shù)。例如,我們可以將上面的函數(shù)變得更有趣一點(diǎn):

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 等同于沒(méi)有傳遞該參數(shù)。因此,animalSentence(undefined, "unicorns") 將返回 "Lions and tigers and unicorns! Oh my!"。如果沒(méi)有為一個(gè)參數(shù)指定默認(rèn)值,那么該參數(shù)的默認(rèn)值為 undefined,所以

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

等同于

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

原文鏈接

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/86772.html

相關(guān)文章

  • ES6學(xué)習(xí)總結(jié)(1)

    摘要:返回一個(gè)對(duì)象,遍歷對(duì)象自身和繼承的所有可枚舉屬性不含,與相同和在紅寶書(shū)中就已經(jīng)提到過(guò)屬性,表示的是引用類(lèi)型實(shí)例的一個(gè)內(nèi)部指針,指向該實(shí)例的構(gòu)造函數(shù)的原型對(duì)象。 半個(gè)月前就決定要將ES6的學(xué)習(xí)總結(jié)一遍,結(jié)果拖延癥一犯,半個(gè)月就過(guò)去了,現(xiàn)在補(bǔ)起來(lái),慚愧慚愧。 阮一峰的《ES6標(biāo)準(zhǔn)入門(mén)》這本書(shū)有300頁(yè)左右,除了幾個(gè)新的API和js語(yǔ)法的擴(kuò)展,真正有價(jià)值的內(nèi)容并不多。所謂存在即合理,每部分的...

    happyfish 評(píng)論0 收藏0
  • ES6 知識(shí)整理一(es6快速入門(mén))

    摘要:函數(shù)調(diào)用會(huì)在內(nèi)存形成一個(gè)調(diào)用記錄,又稱調(diào)用幀,保存調(diào)用位置和內(nèi)部變量等信息。等到運(yùn)行結(jié)束,將結(jié)果返回到,的調(diào)用幀才會(huì)消失。方法用于將一組值,轉(zhuǎn)換為數(shù)組。,和遍歷數(shù)組方法返回一個(gè)布爾值,表示某個(gè)數(shù)組是否包含給定的值,與字符串的方法類(lèi)似。 ES6 簡(jiǎn)介 ES6, 全稱 ECMAScript 6.0 ,是 JavaScript 的下一個(gè)版本標(biāo)準(zhǔn),2015.06 發(fā)版。 let 和 const...

    elva 評(píng)論0 收藏0
  • es6的解構(gòu)賦、擴(kuò)展運(yùn)算符、rest參數(shù)使用

    摘要:模板字符串甚至還能嵌套解構(gòu)賦值允許按照一定模式,從數(shù)組和對(duì)象中提取值,對(duì)變量進(jìn)行賦值,這被稱為解構(gòu)。運(yùn)算符使用場(chǎng)景應(yīng)該稍少一些,主要是處理不定數(shù)量參數(shù),可以避免對(duì)象的使用。 es6中較為常用的書(shū)寫(xiě)風(fēng)格 為了書(shū)寫(xiě)的方便,es6中提出了很多比較友好的書(shū)寫(xiě)方式,其中最為常見(jiàn)的屬于以下幾個(gè): 字符串模板 `abcdef${test}` 解構(gòu)賦值 let [a, b, c] = [1,...

    xuweijian 評(píng)論0 收藏0
  • ES6(2)-各種類(lèi)型的擴(kuò)展(字符串、正則、數(shù)、函數(shù))

    摘要:返回布爾值,表示參數(shù)字符串是否在原字符串的頭部。模板字符串之中還能調(diào)用函數(shù)。其他對(duì)字符串還有許多擴(kuò)展,例如對(duì)字符表示的擴(kuò)充以及為字符串提供了遍歷方法詳情請(qǐng)點(diǎn)擊正則的擴(kuò)展構(gòu)造函數(shù)在中,構(gòu)造函數(shù)的參數(shù)有兩種情況。 ES6對(duì)各種基本類(lèi)型都做了擴(kuò)展,內(nèi)容有些多,本章節(jié)挑選比較重要的擴(kuò)展說(shuō)明。 1 字符串的擴(kuò)展 1.1 includes(), startsWith(), endsWith() 傳...

    godruoyi 評(píng)論0 收藏0
  • ES6學(xué)習(xí)筆記2—各擴(kuò)展

    摘要:字符串的擴(kuò)展字符的表示法允許采用形式表示一個(gè)字符,其中表示字符的碼點(diǎn)。返回布爾值,表示參數(shù)字符串是否在源字符串的頭部。使用和這兩個(gè)常量,用來(lái)表示這個(gè)范圍的上下限。對(duì)于那些無(wú)法用個(gè)二進(jìn)制位精確表示的小數(shù),方法返回最接近這個(gè)小數(shù)的單精度浮點(diǎn)數(shù)。 字符串的擴(kuò)展 字符的 Unicode 表示法 JavaScript 允許采用uxxxx形式表示一個(gè)字符,其中xxxx表示字符的 Unicode 碼...

    Zoom 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<