ES6學(xué)習(xí)—數(shù)組的擴(kuò)展

一擴(kuò)展運(yùn)算符

1.含義

(1)擴(kuò)展運(yùn)算符在數(shù)組將一個數(shù)組轉(zhuǎn)化為由逗號隔開的參數(shù)序列,它就相當(dāng)于rest的逆運(yùn)算

console.log(1,2,...[3,4,5]}
//1,2,3,4,5
console.log(...document.querySelectorAll('div')
//[div,div,div]

(2)該運(yùn)算符主要用于函數(shù)調(diào)用。

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

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

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

在上面的代碼中沪猴,該運(yùn)算符將一個數(shù)組直接變成了參數(shù)序列辐啄,并完成了·arr.push(...items)add(..numbers)函數(shù)的調(diào)用。
例如上面的add他通過運(yùn)算符直接將numbers的兩個參數(shù)變成了函數(shù)add的參數(shù)并參加運(yùn)算运嗜,如果number的元素個數(shù)比函數(shù)add形參個數(shù)多的話壶辜,那add也只會從前往后取值參加運(yùn)算。
(3)擴(kuò)展運(yùn)算符與正常的函數(shù)參數(shù)可以結(jié)合使用担租,非常靈活砸民。

function f(v, w, x, y, z) { }
const args = [0, 1];
f(-1, ...args, 2, ...[3]);

上面代碼中,利用運(yùn)算符...args傳入了兩個參數(shù)奋救,...[3]傳入一個參數(shù) ,分別代表0,1和3
(4)擴(kuò)展運(yùn)算符后面還可以方表達(dá)式岭参。

const arr = [
  ...(x > 0 ? ['a'] : []),
  'b',
];

(5)如果擴(kuò)展運(yùn)算符后面是一個空數(shù)組,則不產(chǎn)生任何效果尝艘。

[...[], 1]
   // [1]   

2.替代函數(shù)apply方法

由于擴(kuò)展運(yùn)算符可以展開數(shù)組演侯,所以不需要apply方法,將數(shù)組轉(zhuǎn)化為函數(shù)了背亥。

// ES5 的寫法
function f(x, y, z) {
  // ...
}
var args = [0, 1, 2];
f.apply(null, args);

// ES6的寫法
function f(x, y, z) {
  // ...
}
let args = [0, 1, 2];
f(...args);

3.應(yīng)用

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

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

a2[0] = 2;
a1 // [2, 2]

上面代碼中秒际,a2不是a1的克隆,而是指向同一個房間的地址而已狡汉,修改a2也會導(dǎo)致a1變化娄徊。

ES5通過變通方法來復(fù)制數(shù)組

const a1 = [1, 2];
const a2 = a1.concat();

a2[0] = 2;
a1 // [1, 2]

擴(kuò)展運(yùn)算符提供了簡便寫法

const a1 = [1, 2];
// 寫法一
const a2 = [...a1];
// 寫法二
const [...a2] = a1;

上面兩種寫法a2都是a1的克隆
(2)合并數(shù)組
擴(kuò)展運(yùn)算符提供了數(shù)組合并的新寫法

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

// ES5 的合并數(shù)組
arr1.concat(arr2, arr3);
// [ 'a', 'b', 'c', 'd', 'e' ]

// ES6 的合并數(shù)組
[...arr1, ...arr2, ...arr3]
// [ 'a', 'b', 'c', 'd', 'e' ]

這兩種辦法都是淺拷貝,使用時需要注意盾戴。

(3)與解構(gòu)賦值結(jié)合

擴(kuò)展運(yùn)算符可以解構(gòu)賦值結(jié)合起來寄锐,生成數(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ù)組復(fù)制尖啡,只能放在數(shù)組最后一位橄仆,否則會報錯。

const [...butLast, last] = [1, 2, 3, 4, 5];
// 報錯
const [first, ...middle, last] = [1, 2, 3, 4, 5];
// 報錯

(4)字符串
擴(kuò)展字符串換可以將字符串轉(zhuǎn)為真正的數(shù)組

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

二.Array.from()
Array.from方法用于將兩類對象轉(zhuǎn)為真正的數(shù)組可婶,類似數(shù)組的對象和可比遍歷對象

let arrayLike = {
    '0': 'a',
    '1': 'b',
    '2': 'c',
    length: 3
};

// ES5的寫法
var arr1 = [].slice.call(arrayLike); // ['a', 'b', 'c']

// ES6的寫法
let arr2 = Array.from(arrayLike); // ['a', 'b', 'c']

在實(shí)際應(yīng)用中沿癞,大家常見的對象影視DOM操作后返回的NodeList集合援雇,以及函數(shù)的arguments對象矛渴。Array.from都可以將他們轉(zhuǎn)為真正的數(shù)組。

// NodeList對象
let ps = document.querySelectorAll('p');
Array.from(ps)
});

// arguments對象
function foo() {
  var args = Array.from(arguments);
  // ...
}

如果參數(shù)是一個真正的數(shù)組,Array.from會返回一個一樣的新數(shù)組具温。

Array.from([1, 2, 3])
// [1, 2, 3]

值得提醒的是蚕涤,擴(kuò)展運(yùn)算符(...)也可以將某些數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)為數(shù)組。

// arguments對象
function foo() {
  const args = [...arguments];
}

// NodeList對象
[...document.querySelectorAll('div')]

三.Array.from()

Array.of方法用于將一組值铣猩,轉(zhuǎn)換為數(shù)組

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

這個方法的主要目的揖铜,是彌補(bǔ)數(shù)組構(gòu)造函數(shù)Array()的不足。因?yàn)閰?shù)個數(shù)的不同达皿,會導(dǎo)致Array()的行為有差異天吓。

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

上面代碼中,Array方法沒有參數(shù)峦椰、一個參數(shù)龄寞、三個參數(shù)時,返回結(jié)果都不一樣汤功。只有當(dāng)參數(shù)個數(shù)不少于 2 個時物邑,`Array()才會返回由參數(shù)組成的新數(shù)組。參數(shù)個數(shù)只有一個時滔金,實(shí)際上是指定數(shù)組的長度色解。

Array.of基本上可以用來替代Array()new Array(),并且不存在由于參數(shù)不同而導(dǎo)致的重載餐茵。它的行為非常統(tǒng)一科阎。

Array.of() // []
Array.of(undefined) // [undefined]
Array.of(1) // [1]
Array.of(1, 2) // [1, 2]

Array.of總是返回參數(shù)值組成的數(shù)組。如果沒有參數(shù)忿族,就返回一個空數(shù)組

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末萧恕,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子肠阱,更是在濱河造成了極大的恐慌票唆,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屹徘,死亡現(xiàn)場離奇詭異走趋,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)噪伊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進(jìn)店門簿煌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鉴吹,你說我怎么就攤上這事姨伟。” “怎么了豆励?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵夺荒,是天一觀的道長瞒渠。 經(jīng)常有香客問我,道長技扼,這世上最難降的妖魔是什么伍玖? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮剿吻,結(jié)果婚禮上窍箍,老公的妹妹穿的比我還像新娘。我一直安慰自己丽旅,他們只是感情好椰棘,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著榄笙,像睡著了一般晰搀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上办斑,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天外恕,我揣著相機(jī)與錄音,去河邊找鬼乡翅。 笑死鳞疲,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蠕蚜。 我是一名探鬼主播尚洽,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼靶累!你這毒婦竟也來了腺毫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤挣柬,失蹤者是張志新(化名)和其女友劉穎潮酒,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體邪蛔,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡急黎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了侧到。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片勃教。...
    茶點(diǎn)故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖匠抗,靈堂內(nèi)的尸體忽然破棺而出故源,到底是詐尸還是另有隱情,我是刑警寧澤汞贸,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布绳军,位于F島的核電站印机,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏删铃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一踏堡、第九天 我趴在偏房一處隱蔽的房頂上張望猎唁。 院中可真熱鬧,春花似錦顷蟆、人聲如沸诫隅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逐纬。三九已至,卻和暖如春削樊,著一層夾襖步出監(jiān)牢的瞬間豁生,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工漫贞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留甸箱,地道東北人。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓迅脐,卻偏偏與公主長得像芍殖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子谴蔑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評論 2 349

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