摘要:在中,引入了一種新方法來(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
摘要:返回一個(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)容并不多。所謂存在即合理,每部分的...
摘要:函數(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...
摘要:模板字符串甚至還能嵌套解構(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,...
摘要:返回布爾值,表示參數(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() 傳...
摘要:字符串的擴(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 碼...
閱讀 1210·2021-11-10 11:35
閱讀 2952·2021-09-24 10:35
閱讀 2976·2021-09-22 15:38
閱讀 2815·2019-08-30 15:43
閱讀 1349·2019-08-29 18:39
閱讀 2592·2019-08-29 15:22
閱讀 2802·2019-08-28 18:17
閱讀 619·2019-08-26 13:37