...args剩余參數(shù)(展開運(yùn)算符)的用法及與arguments的區(qū)別

...args剩余參數(shù)(展開運(yùn)算符)

允許一個(gè)表達(dá)式在某處展開。展開運(yùn)算符在多個(gè)參數(shù)(用于函數(shù)調(diào)用)或多個(gè)元素(用于數(shù)組字面量)或者多個(gè)變量(用于解構(gòu)賦值)的地方可以使用暇榴。剩余參數(shù)語法允許我們將一個(gè)不定數(shù)量的參數(shù)表示為一個(gè)數(shù)組厚棵。


function sum(...theArgs) {

  return theArgs.reduce((previous, current) => {

    return previous + current;

  });

}

console.log(sum(1, 2, 3));

// expected output: 6

console.log(sum(1, 2, 3, 4));

// expected output: 10

描述

如果函數(shù)的最后一個(gè)命名參數(shù)以...為前綴,則它將成為一個(gè)數(shù)組蔼紧,其中從0(包括)到theArgs.length(排除)的元素由傳遞給函數(shù)的實(shí)際參數(shù)提供婆硬。

用法

function(a, b, ...theArgs) {

  // ...

}

在上面的例子中,theArgs將收集該函數(shù)的第三個(gè)參數(shù)(因?yàn)榈谝粋€(gè)參數(shù)被映射到a奸例,而第二個(gè)參數(shù)映射到b)和所有后續(xù)參數(shù)彬犯。

函數(shù)調(diào)用中使用展開運(yùn)算符

在以前我們會(huì)使用apply方法來將一個(gè)數(shù)組展開成多個(gè)參數(shù):


function test(a, b, c) { }

var args = [0, 1, 2];

test.apply(null, args);

如上,我們把a(bǔ)rgs數(shù)組當(dāng)作實(shí)參傳遞給了a,b,c查吊,這邊正是利用了Function.prototype.apply的特性谐区。

不過有了ES6,我們就可以更加簡(jiǎn)潔地來傳遞數(shù)組參數(shù):


function test(a,b,c) { }

var args = [0,1,2];

test(...args);

我們使用...展開運(yùn)算符就可以把a(bǔ)rgs直接傳遞給test()函數(shù)逻卖。

數(shù)組字面量中使用展開運(yùn)算符

在ES6的世界中宋列,我們可以直接加一個(gè)數(shù)組直接合并到另外一個(gè)數(shù)組當(dāng)中:


var arr1=['a','b','c'];

var arr2=[...arr1,'d','e']; //['a','b','c','d','e']

展開運(yùn)算符也可以用在push函數(shù)中,可以不用再用apply()函數(shù)來合并兩個(gè)數(shù)組:


var arr1=['a','b','c'];

var arr2=['d','e'];

arr1.push(...arr2); //['a','b','c','d','e']

用于解構(gòu)賦值

解構(gòu)賦值也是ES6中的一個(gè)特性评也,而這個(gè)展開運(yùn)算符可以用于部分情景:


let [arg1,arg2,...arg3] = [1, 2, 3, 4];

arg1 //1

arg2 //2

arg3 //['3','4']

展開運(yùn)算符在解構(gòu)賦值中的作用跟之前的作用看上去是相反的炼杖,將多個(gè)數(shù)組項(xiàng)組合成了一個(gè)新數(shù)組灭返。

不過要注意,解構(gòu)賦值中展開運(yùn)算符只能用在最后:


let [arg1,...arg2,arg3] = [1, 2, 3, 4]; //報(bào)錯(cuò)

類數(shù)組對(duì)象變成數(shù)組

展開運(yùn)算符可以將一個(gè)類數(shù)組對(duì)象變成一個(gè)真正的數(shù)組對(duì)象:


let a=new Set([1,2,3,4,5,2,1])  // a : Set(5) {1, 2, 3, 4, 5}

let b=[...a]    //  (5) [1, 2, 3, 4, 5]

ES7草案中的對(duì)象展開運(yùn)算符

ES7中的對(duì)象展開運(yùn)算符符可以讓我們更快捷地操作對(duì)象:


let {x,y,...z}={x:1,y:2,a:3,b:4};

x; //1

y; //2

z; //{a:3,b:4}

如上坤邪,我們可以將一個(gè)對(duì)象當(dāng)中的對(duì)象的一部分取出來成為一個(gè)新對(duì)象賦值給展開運(yùn)算符的參數(shù)熙含。

同時(shí),我們也可以像數(shù)組插入那樣將一個(gè)對(duì)象插入另外一個(gè)對(duì)象當(dāng)中:


let z={a:3,b:4};

let n={x:1,y:2,...z};

n; //{x:1,y:2,a:3,b:4}

另外還要很多用處罩扇,比如可以合并兩個(gè)對(duì)象:


let a={x:1,y:2};

let b={z:3};

let ab={...a,...b};

ab //{x:1,y:2,z:3}

arguments 對(duì)象

在函數(shù)代碼中婆芦,使用特殊對(duì)象 arguments,開發(fā)者無需明確指出參數(shù)名喂饥,就能訪問它們。

例如肠鲫,在函數(shù) sayHi() 中,第一個(gè)參數(shù)是 message。用 arguments[0] 也可以訪問這個(gè)值躬窜,即第一個(gè)參數(shù)的值(第一個(gè)參數(shù)位于位置 0谬盐,第二個(gè)參數(shù)位于位置 1,依此類推)渣锦。

因此硝岗,無需明確命名參數(shù),就可以重寫函數(shù):


function sayHi(message) {

  alert(arguments[0]);  // 此處將打印message參數(shù)的值

}

檢測(cè)參數(shù)個(gè)數(shù)

還可以用 arguments 對(duì)象檢測(cè)函數(shù)的參數(shù)個(gè)數(shù)袋毙,引用屬性 arguments.length 即可型檀。

下面的代碼將輸出每次調(diào)用函數(shù)使用的參數(shù)個(gè)數(shù):


function howManyArgs() {

  alert(arguments.length);

}

howManyArgs("string", 45);

howManyArgs();

howManyArgs(12);  //  上面這段代碼將依次顯示 "2"、"0" 和 "1"听盖。

模擬函數(shù)重載

用 arguments 對(duì)象判斷傳遞給函數(shù)的參數(shù)個(gè)數(shù)胀溺,即可模擬函數(shù)重載:


function doAdd() {

  if(arguments.length == 1) {

    alert(arguments[0] + 5);

  } else if(arguments.length == 2) {

    alert(arguments[0] + arguments[1]);

  }

}

doAdd(10);  //輸出 "15"

doAdd(40, 20);  //輸出 "60"

當(dāng)只有一個(gè)參數(shù)時(shí),doAdd() 函數(shù)給參數(shù)加 5皆看。如果有兩個(gè)參數(shù)仓坞,則會(huì)把兩個(gè)參數(shù)相加,返回它們的和腰吟。所以无埃,doAdd(10) 輸出的是 "15",而 doAdd(40, 20) 輸出的是 "60"毛雇。

...args剩余參數(shù)和 arguments對(duì)象的區(qū)別

剩余參數(shù)和 arguments對(duì)象之間的區(qū)別主要有三個(gè):

1.剩余參數(shù)只包含那些沒有對(duì)應(yīng)形參的實(shí)參嫉称,而 arguments 對(duì)象包含了傳給函數(shù)的所有實(shí)參。

2.arguments對(duì)象不是一個(gè)真正的數(shù)組禾乘,而剩余參數(shù)是真正的 Array實(shí)例澎埠,也就是說你能夠在它上面直接使用所有的數(shù)組方法,比如 sort始藕,map蒲稳,forEach或pop氮趋。

3.arguments對(duì)象還有一些附加的屬性 (如callee屬性)。
更多參考

[MDN 展開語法

](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Spread_syntax)

[MDN Arguments 對(duì)象

](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/arguments)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末江耀,一起剝皮案震驚了整個(gè)濱河市剩胁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌祥国,老刑警劉巖昵观,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異舌稀,居然都是意外死亡啊犬,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門壁查,熙熙樓的掌柜王于貴愁眉苦臉地迎上來觉至,“玉大人,你說我怎么就攤上這事睡腿∮镉” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵席怪,是天一觀的道長(zhǎng)应闯。 經(jīng)常有香客問我,道長(zhǎng)挂捻,這世上最難降的妖魔是什么碉纺? 我笑而不...
    開封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮细层,結(jié)果婚禮上惜辑,老公的妹妹穿的比我還像新娘。我一直安慰自己疫赎,他們只是感情好盛撑,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著捧搞,像睡著了一般抵卫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上胎撇,一...
    開封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天介粘,我揣著相機(jī)與錄音,去河邊找鬼晚树。 笑死姻采,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的爵憎。 我是一名探鬼主播慨亲,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼婚瓜,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了刑棵?” 一聲冷哼從身側(cè)響起巴刻,我...
    開封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蛉签,沒想到半個(gè)月后胡陪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡碍舍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年柠座,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乒验。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡愚隧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出锻全,到底是詐尸還是另有隱情,我是刑警寧澤录煤,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布鳄厌,位于F島的核電站,受9級(jí)特大地震影響妈踊,放射性物質(zhì)發(fā)生泄漏了嚎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一廊营、第九天 我趴在偏房一處隱蔽的房頂上張望歪泳。 院中可真熱鬧,春花似錦露筒、人聲如沸呐伞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伶氢。三九已至,卻和暖如春瘪吏,著一層夾襖步出監(jiān)牢的瞬間癣防,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來泰國打工掌眠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蕾盯,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓蓝丙,卻偏偏與公主長(zhǎng)得像级遭,于是被迫代替她去往敵國和親望拖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359