深入理解 ES6 中的 ...

image.png

ES6/ES2015 對 Javascript 語言進(jìn)行了重大升級骗灶。它引入了許多不同的新功能。其中之一就是我們可以用在任何兼容容器(對象系草、數(shù)組通熄、字符串、集合找都、映射)前面的三個連續(xù)點(diǎn)唇辨。這使我們能夠編寫更加優(yōu)雅和簡潔的代碼。本文將會使用最常見的例子來解釋這三個點(diǎn)

三個點(diǎn)具有兩個含義:展開運(yùn)算符(spread operator)和 剩余運(yùn)算符(rest operator)

展開運(yùn)算符

展開運(yùn)算符允許迭代器在接收器內(nèi)部分別展開或擴(kuò)展能耻。
迭代器和接收器可以是任何可以循環(huán)的對象赏枚,例如數(shù)組、對象晓猛、集合饿幅、映射等。
你可以把一個容器的每個部分分別放入另一個容器鞍帝。

const arr = ['axtlive',...anotherArr];

剩余運(yùn)算符

剩余參數(shù)語法允許我們將無限數(shù)量的參數(shù)表示為數(shù)組诫睬,命名參數(shù)的位置可以在剩余參數(shù)之前。

const func = (first,second,...rest) => {};

使用示例

數(shù)組示例

  1. 復(fù)制數(shù)組

當(dāng)我們需要修改一個數(shù)組帕涌,但又不想改變原數(shù)組(因?yàn)槠渌胤娇赡軙褂玫皆瓟?shù)組),因此我們必須進(jìn)行數(shù)組的復(fù)制续徽。

const arr = ['Vue','React','Angular'];
const copyArr = [...arr];    // ['Vue','React','Angular'];

console.log(arr === copyArr);  // false

它可以選擇數(shù)組(arr)里面的每個元素蚓曼,并把每個元素放到新的數(shù)據(jù)結(jié)構(gòu)(copyArr)中。

當(dāng)然我們也可以使用老的數(shù)組方法 map 來實(shí)現(xiàn)數(shù)組的復(fù)制并進(jìn)行身份映射钦扭。

arr.map(item => item);
  1. 唯一數(shù)組

如果我們想從數(shù)組里篩選出重復(fù)的元素纫版,最簡單的解決方案是什么?

Set 對象里面存儲的都是唯一的元素客情,并且可以用數(shù)組填充其弊。同時它也具有迭代接口癞己,則我們可以把它展開到新的數(shù)組中去,得到的數(shù)組中的值就是唯一的梭伐。

const fruits = ['apple', 'orange', 'banana', 'banana'];
const uniqueFruits = [...new Set(fruits)]; // ['apple', 'orange', 'banana'];

// old way
fruits.filter((fruit, index, arr) => arr.indexOf(fruit) === index);
  1. 串聯(lián)數(shù)組

我們可以使用 concat 方法來連接兩個獨(dú)立的數(shù)組痹雅,那同樣的也可以使用展開運(yùn)算符呀!

const fruits = ['apple', 'orange', 'banana'];
const vegetables = ['carrot'];
const fruitsAndVegetables = [...fruits, ...vegetables]; // ['apple', 'orange', 'banana', 'carrot']
const fruitsAndVegetables = ['carrot', ...fruits]; // ['carrot', 'apple', 'orange', 'banana']

// old way
const fruitsAndVegetables = fruits.concat(vegetables);
fruits.unshift('carrot');
  1. 將參數(shù)作為數(shù)組進(jìn)行傳遞

當(dāng)傳遞參數(shù)時糊识,展開運(yùn)算符可以使我們的代碼更具可讀性绩社。
在 ES6 之前,我們必須把函數(shù)應(yīng)用于 arguments 赂苗。
如今我們可以把參數(shù)展開到函數(shù)中愉耙,使得代碼更加簡潔。

const mixer = (x,y,z) => console.log(x,y,z);
const fruits = ['apple', 'orange', 'banana'];

mixer(...fruits); // 'apple', 'orange', 'banana'

// old way
mixer.apply(null, fruits);
  1. 數(shù)組切割

如果有需要拌滋,使用展開運(yùn)算符可以實(shí)現(xiàn)數(shù)組的切割朴沿,但是必須一個個的去命名剩余的元素,如果數(shù)組過大败砂,這并不是一個好的方式赌渣。
使用 slice 方法切割更加直接。

const fruits = ['apple', 'orange', 'banana'];
const [apple, ...remainingFruits] = fruits; // ['orange', 'banana']

// old way
const remainingFruits = fruits.slice(1);
  1. 將參數(shù)轉(zhuǎn)換為數(shù)組

Javascript 中的參數(shù)是類似數(shù)組的對象吠卷。
你可以用索引來訪問它锡垄,但是不能調(diào)用像 mapfilter 這樣的數(shù)組方法祭隔。
參數(shù)是一個可迭代的對象货岭,那么我們做些什么呢?在它們前面放三個點(diǎn)疾渴,然后作為數(shù)組去訪問千贯!

const func = (...args) => console.log(args);
func('React');     // ['React'];
  1. 將 NodeList 轉(zhuǎn)換為數(shù)組

參數(shù)就像從 querySelectorAll 函數(shù)返回的 NodeList 一樣。
它們的行為也有點(diǎn)像數(shù)組搞坝,只是沒有對應(yīng)的方法搔谴。

[...document.querySelectorAll('div')];

// old way
Array.prototype.slice.call(document.querySelectorAll('div'));

對象示例

  1. 復(fù)制對象

復(fù)制對象和復(fù)制數(shù)組的工作方式相同。
在這之前你也可以使用 Object.assign 和一個空對象來實(shí)現(xiàn)對象的復(fù)制桩撮。

const info = {name:'axtlive'};
const copyInfo = {...info}; // {name:'axtlive'}

console.log(info = copyInfo); // false

// old way
const copyInfo = Object.assign({},info)
  1. 合并對象

合并的唯一區(qū)別是具有相同鍵的屬性將被覆蓋敦第。
最右邊的屬性具有最高優(yōu)先級。

const info1 = {name:'axtlive'};
const info2 = {age:23};
const info3 = {look:'cool'};

const infoOfMe = {...info1,...info2,...info3}; // {name:'axtlive',age:23,look:'cool'}

// old way
Object.assigin({},info1,info2,info3);

字符串示例

  1. 將字符串拆分成字符

你可以用展開運(yùn)算符把字符串拆分為字符店量。
當(dāng)然芜果,如果你用空字符串調(diào)用 split 方法也是一樣的。

const city = 'SHANGHAI';
console.log([...city]); // ['S','H','A','N','G','H','A','I']

// old way
city.split('')

總結(jié)

在本文中我們研究了 Javascript 中展開運(yùn)算符的許多用例融师。如你所見右钾,ES6 不僅使編寫代碼的效率更高,而且還引入了一些有趣的方法來解決長期存在的問題。現(xiàn)在所有主流瀏覽器都支持新語法舀射。在你閱讀本文時窘茁,就可以在瀏覽器的控制臺中嘗試上述所有例子。無論用哪種方式脆烟,你現(xiàn)在就可以把展開運(yùn)算符和剩余參數(shù)用到自己的代碼中山林。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市浩淘,隨后出現(xiàn)的幾起案子捌朴,更是在濱河造成了極大的恐慌,老刑警劉巖张抄,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件砂蔽,死亡現(xiàn)場離奇詭異,居然都是意外死亡署惯,警方通過查閱死者的電腦和手機(jī)左驾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來极谊,“玉大人诡右,你說我怎么就攤上這事∏岵” “怎么了帆吻?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長咙边。 經(jīng)常有香客問我猜煮,道長,這世上最難降的妖魔是什么败许? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任王带,我火速辦了婚禮,結(jié)果婚禮上市殷,老公的妹妹穿的比我還像新娘愕撰。我一直安慰自己,他們只是感情好醋寝,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布搞挣。 她就那樣靜靜地躺著,像睡著了一般音羞。 火紅的嫁衣襯著肌膚如雪柿究。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天黄选,我揣著相機(jī)與錄音,去河邊找鬼。 笑死办陷,一個胖子當(dāng)著我的面吹牛貌夕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播民镜,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼啡专,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了制圈?” 一聲冷哼從身側(cè)響起们童,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鲸鹦,沒想到半個月后慧库,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡馋嗜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年齐板,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片葛菇。...
    茶點(diǎn)故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡甘磨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出眯停,到底是詐尸還是另有隱情济舆,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布莺债,位于F島的核電站滋觉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏九府。R本人自食惡果不足惜椎瘟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望侄旬。 院中可真熱鬧肺蔚,春花似錦、人聲如沸儡羔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽汰蜘。三九已至仇冯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間族操,已是汗流浹背苛坚。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工比被, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人泼舱。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓等缀,卻偏偏與公主長得像,于是被迫代替她去往敵國和親娇昙。 傳聞我的和親對象是個殘疾皇子尺迂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,381評論 0 5
  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 10,970評論 6 13
  • 三,字符串?dāng)U展 3.1 Unicode表示法 ES6 做出了改進(jìn)冒掌,只要將碼點(diǎn)放入大括號噪裕,就能正確解讀該字符。有了這...
    eastbaby閱讀 1,534評論 0 8
  • JavaScript深入理解ES6中的箭頭函數(shù) 箭頭函數(shù)表達(dá)式的語法比函數(shù)表達(dá)式短股毫,并且不綁定自己的 this膳音,a...
    488a74c3bb61閱讀 960評論 0 7
  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,233評論 0 4