ES6中數(shù)組新增了哪些擴(kuò)展?

hei001.jpg

一、擴(kuò)展運(yùn)算符的應(yīng)用

ES6通過(guò)擴(kuò)展元素符...,好比 rest 參數(shù)的逆運(yùn)算疟赊,將一個(gè)數(shù)組轉(zhuǎn)為用逗號(hào)分隔的參數(shù)序列

console.log(...[1, 2, 3])
// 1 2 3

console.log(1, ...[2, 3, 4], 5)
// 1 2 3 4 5

[...document.querySelectorAll('div')]
// [<div>, <div>, <div>]

主要用于函數(shù)調(diào)用的時(shí)候鞋囊,將一個(gè)數(shù)組變?yōu)閰?shù)序列

function push(array, ...items) {
  array.push(...items);
}

function add(x, y) {
  return x + y;
}

const numbers = [4, 38];
add(...numbers) // 42

可以將某些數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)為數(shù)組

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

能夠更簡(jiǎn)單實(shí)現(xiàn)數(shù)組復(fù)制

const a1 = [1, 2];
const [...a2] = a1;
// [1,2]

數(shù)組的合并也更為簡(jiǎn)潔了

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

注意:通過(guò)擴(kuò)展運(yùn)算符實(shí)現(xiàn)的是淺拷貝隅居,修改了引用指向的值钠至,會(huì)同步反映到新數(shù)組
下面看個(gè)例子就清楚多了

const arr1 = ['a', 'b',[1,2]];
const arr2 = ['c'];
const arr3  = [...arr1,...arr2]
arr1[2][0] = 9999 // 修改arr1里面數(shù)組成員值
console.log(arr3 ) // 影響到arr3,['a','b',[9999,2],'c']

擴(kuò)展運(yùn)算符可以與解構(gòu)賦值結(jié)合起來(lái),用于生成數(shù)組

const [first, ...rest] = [1, 2, 3, 4, 5];
first // 1
rest  // [2, 3, 4, 5]

const [first, ...rest] = [];
first // undefined
rest  // []

const [first, ...rest] = ["foo"];
first  // "foo"
rest   // []

如果將擴(kuò)展運(yùn)算符用于數(shù)組賦值胎源,只能放在參數(shù)的最后一位棉钧,否則會(huì)報(bào)錯(cuò)

const [...butLast, last] = [1, 2, 3, 4, 5];
// 報(bào)錯(cuò)

const [first, ...middle, last] = [1, 2, 3, 4, 5];
// 報(bào)錯(cuò)

可以將字符串轉(zhuǎn)為真正的數(shù)組

[...'hello']
// [ "h", "e", "l", "l", "o" ]

定義了遍歷器(Iterator)接口的對(duì)象,都可以用擴(kuò)展運(yùn)算符轉(zhuǎn)為真正的數(shù)組

let nodeList = document.querySelectorAll('div');
let array = [...nodeList];

let map = new Map([
  [1, 'one'],
  [2, 'two'],
  [3, 'three'],
]);

let arr = [...map.keys()]; // [1, 2, 3]

如果對(duì)沒(méi)有 Iterator 接口的對(duì)象涕蚤,使用擴(kuò)展運(yùn)算符宪卿,將會(huì)報(bào)錯(cuò)

const obj = {a: 1, b: 2};
let arr = [...obj]; // TypeError: Cannot spread non-iterable object

二、構(gòu)造函數(shù)新增的方法

關(guān)于構(gòu)造函數(shù)赞季,數(shù)組新增的方法有如下:

  • Array.from()
  • Array.of()
Array.from()

將兩類(lèi)對(duì)象轉(zhuǎn)為真正的數(shù)組:類(lèi)似數(shù)組的對(duì)象和可遍歷(iterable)的對(duì)象(包括 ES6 新增的數(shù)據(jù)結(jié)構(gòu) Set 和 Map)

let arrayLike = {
    '0': 'a',
    '1': 'b',
    '2': 'c',
    length: 3
};
let arr2 = Array.from(arrayLike); // ['a', 'b', 'c']

還可以接受第二個(gè)參數(shù)愧捕,用來(lái)對(duì)每個(gè)元素進(jìn)行處理,將處理后的值放入返回的數(shù)組

Array.from([1, 2, 3], (x) => x * x)
// [1, 4, 9]
Array.of()

用于將一組值申钩,轉(zhuǎn)換為數(shù)組

Array.of(3, 11, 8) // [3,11,8]

沒(méi)有參數(shù)的時(shí)候次绘,返回一個(gè)空數(shù)組
當(dāng)參數(shù)只有一個(gè)的時(shí)候,實(shí)際上是指定數(shù)組的長(zhǎng)度
參數(shù)個(gè)數(shù)不少于 2 個(gè)時(shí)撒遣,Array()才會(huì)返回由參數(shù)組成的新數(shù)組

Array() // []
Array(3) // [, , ,]
Array(3, 11, 8) // [3, 11, 8]

三邮偎、實(shí)例對(duì)象新增的方法

關(guān)于數(shù)組實(shí)例對(duì)象新增的方法有如下:

  • copyWithin()
  • find()、findIndex()
  • fill()
  • entries()义黎,keys()禾进,values()
  • includes()
  • flat(),flatMap()
copyWithin()

將指定位置的成員復(fù)制到其他位置(會(huì)覆蓋原有成員)廉涕,然后返回當(dāng)前數(shù)組
參數(shù)如下:

  • target(必需):從該位置開(kāi)始替換數(shù)據(jù)泻云。如果為負(fù)值,表示倒數(shù)狐蜕。
  • start(可選):從該位置開(kāi)始讀取數(shù)據(jù)宠纯,默認(rèn)為 0。如果為負(fù)值层释,表示從末尾開(kāi)始計(jì)算婆瓜。
  • end(可選):到該位置前停止讀取數(shù)據(jù),默認(rèn)等于數(shù)組長(zhǎng)度贡羔。如果為負(fù)值廉白,表示從末尾開(kāi)始計(jì)算。
[1, 2, 3, 4, 5].copyWithin(0, 3) // 將從 3 號(hào)位直到數(shù)組結(jié)束的成員(4 和 5)乖寒,復(fù)制到從 0 號(hào)位開(kāi)始的位置猴蹂,結(jié)果覆蓋了原來(lái)的 1 和 2
// [4, 5, 3, 4, 5] 
find()、findIndex()

find()用于找出第一個(gè)符合條件的數(shù)組成員
參數(shù)是一個(gè)回調(diào)函數(shù)楣嘁,接受三個(gè)參數(shù)依次為當(dāng)前的值磅轻、當(dāng)前的位置和原數(shù)組

[1, 5, 10, 15].find(function(value, index, arr) {
  return value > 9;
}) // 10

findIndex返回第一個(gè)符合條件的數(shù)組成員的位置覆获,如果所有成員都不符合條件,則返回-1

[1, 5, 10, 15].findIndex(function(value, index, arr) {
  return value > 9;
}) // 2

這兩個(gè)方法都可以接受第二個(gè)參數(shù)瓢省,用來(lái)綁定回調(diào)函數(shù)的this對(duì)象。

function f(v){
  return v > this.age;
}
let person = {name: 'John', age: 20};
[10, 12, 26, 15].find(f, person);    // 26
fill()

使用給定值痊班,填充一個(gè)數(shù)組

['a', 'b', 'c'].fill(7)
// [7, 7, 7]

new Array(3).fill(7)
// [7, 7, 7]

還可以接受第二個(gè)和第三個(gè)參數(shù)勤婚,用于指定填充的起始位置和結(jié)束位置

['a', 'b', 'c'].fill(7, 1, 2)
// ['a', 7, 'c']

注意,如果填充的類(lèi)型為對(duì)象涤伐,則是淺拷貝

entries()馒胆,keys(),values()

keys()是對(duì)鍵名的遍歷凝果、values()是對(duì)鍵值的遍歷祝迂,entries()是對(duì)鍵值對(duì)的遍歷

or (let index of ['a', 'b'].keys()) {
  console.log(index);
}
// 0
// 1

for (let elem of ['a', 'b'].values()) {
  console.log(elem);
}
// 'a'
// 'b'

for (let [index, elem] of ['a', 'b'].entries()) {
  console.log(index, elem);
}
// 0 "a"
includes()

用于判斷數(shù)組是否包含給定的值

[1, 2, 3].includes(2)     // true
[1, 2, 3].includes(4)     // false
[1, 2, NaN].includes(NaN) // true

方法的第二個(gè)參數(shù)表示搜索的起始位置,默認(rèn)為0
參數(shù)為負(fù)數(shù)則表示倒數(shù)的位置

[1, 2, 3].includes(3, 3);  // false
[1, 2, 3].includes(3, -1); // true
flat()器净,flatMap()

將數(shù)組扁平化處理型雳,返回一個(gè)新數(shù)組,對(duì)原數(shù)據(jù)沒(méi)有影響

[1, 2, [3, 4]].flat()
// [1, 2, 3, 4]

flat()默認(rèn)只會(huì)“拉平”一層山害,如果想要“拉平”多層的嵌套數(shù)組纠俭,可以將flat()方法的參數(shù)寫(xiě)成一個(gè)整數(shù),表示想要拉平的層數(shù)浪慌,默認(rèn)為1

[1, 2, [3, [4, 5]]].flat()
// [1, 2, 3, [4, 5]]

[1, 2, [3, [4, 5]]].flat(2)
// [1, 2, 3, 4, 5]

flatMap()方法對(duì)原數(shù)組的每個(gè)成員執(zhí)行一個(gè)函數(shù)相當(dāng)于執(zhí)行Array.prototype.map()冤荆,然后對(duì)返回值組成的數(shù)組執(zhí)行flat()方法。該方法返回一個(gè)新數(shù)組权纤,不改變?cè)瓟?shù)組

// 相當(dāng)于 [[2, 4], [3, 6], [4, 8]].flat()
[2, 3, 4].flatMap((x) => [x, x * 2])
// [2, 4, 3, 6, 4, 8]

flatMap()方法還可以有第二個(gè)參數(shù)钓简,用來(lái)綁定遍歷函數(shù)里面的this

四、數(shù)組的空位

數(shù)組的空位指汹想,數(shù)組的某一個(gè)位置沒(méi)有任何值

ES6 則是明確將空位轉(zhuǎn)為undefined外邓,包括Array.from、擴(kuò)展運(yùn)算符欧宜、copyWithin()坐榆、fill()、entries()冗茸、keys()席镀、values()、find()和findIndex()

建議大家在日常書(shū)寫(xiě)中夏漱,避免出現(xiàn)空位

五豪诲、排序穩(wěn)定性

將sort()默認(rèn)設(shè)置為穩(wěn)定的排序算法

const arr = [
  'peach',
  'straw',
  'apple',
  'spork'
];

const stableSorting = (s1, s2) => {
  if (s1[0] < s2[0]) return -1;
  return 1;
};

arr.sort(stableSorting)
// ["apple", "peach", "straw", "spork"]

排序結(jié)果中,straw在spork的前面挂绰,跟原始順序一致

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末屎篱,一起剝皮案震驚了整個(gè)濱河市服赎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌交播,老刑警劉巖重虑,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異秦士,居然都是意外死亡缺厉,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)隧土,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)提针,“玉大人,你說(shuō)我怎么就攤上這事曹傀》保” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵皆愉,是天一觀的道長(zhǎng)嗜价。 經(jīng)常有香客問(wèn)我,道長(zhǎng)幕庐,這世上最難降的妖魔是什么炭剪? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮翔脱,結(jié)果婚禮上奴拦,老公的妹妹穿的比我還像新娘。我一直安慰自己届吁,他們只是感情好错妖,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著疚沐,像睡著了一般暂氯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上亮蛔,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天痴施,我揣著相機(jī)與錄音,去河邊找鬼究流。 笑死辣吃,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的芬探。 我是一名探鬼主播神得,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼偷仿!你這毒婦竟也來(lái)了哩簿?” 一聲冷哼從身側(cè)響起宵蕉,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎节榜,沒(méi)想到半個(gè)月后羡玛,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宗苍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年缝左,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浓若。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蛇数,靈堂內(nèi)的尸體忽然破棺而出挪钓,到底是詐尸還是另有隱情,我是刑警寧澤耳舅,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布碌上,位于F島的核電站,受9級(jí)特大地震影響浦徊,放射性物質(zhì)發(fā)生泄漏馏予。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一盔性、第九天 我趴在偏房一處隱蔽的房頂上張望霞丧。 院中可真熱鬧,春花似錦冕香、人聲如沸蛹尝。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)突那。三九已至,卻和暖如春构眯,著一層夾襖步出監(jiān)牢的瞬間愕难,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工惫霸, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留猫缭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓壹店,卻偏偏與公主長(zhǎng)得像饵骨,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子茫打,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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

  • 1、Array.from()-用于將兩類(lèi)對(duì)象轉(zhuǎn)為真正的數(shù)組:類(lèi)似數(shù)組的對(duì)象(array-like object)和...
    jie_zhao閱讀 262評(píng)論 0 0
  • 擴(kuò)展運(yùn)算符 1.擴(kuò)展運(yùn)算符的使用方法 2.擴(kuò)展運(yùn)算符的應(yīng)用(1)復(fù)制數(shù)組 (2)合并數(shù)組 (3)與解構(gòu)賦值結(jié)合 (...
    不會(huì)潛水的貓小喵閱讀 1,446評(píng)論 0 0
  • 一轮洋、擴(kuò)展運(yùn)算符 將一個(gè)數(shù)組轉(zhuǎn)為用逗號(hào)分隔的參數(shù)序列制市。 示列代碼 二、 Array.from() 該方法可以將類(lèi)數(shù)組...
    422ccfa02512閱讀 175評(píng)論 0 0
  • 擴(kuò)展運(yùn)算符(...) 含義:擴(kuò)展運(yùn)算符(spread)是三個(gè)點(diǎn)(...)弊予。它好比 reset 參數(shù)的逆運(yùn)算祥楣,將一個(gè)...
    人總要靠自己_趁年輕去努力閱讀 693評(píng)論 0 1
  • 推薦指數(shù): 6.0 書(shū)籍主旨關(guān)鍵詞:特權(quán)、焦點(diǎn)汉柒、注意力误褪、語(yǔ)言聯(lián)想、情景聯(lián)想 觀點(diǎn): 1.統(tǒng)計(jì)學(xué)現(xiàn)在叫數(shù)據(jù)分析碾褂,社會(huì)...
    Jenaral閱讀 5,701評(píng)論 0 5