您好,登錄后才能下訂單哦!
這篇文章主要講解了“ES6中的擴(kuò)展運(yùn)算符怎么使用”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“ES6中的擴(kuò)展運(yùn)算符怎么使用”吧!
ES6的擴(kuò)展運(yùn)算符,它的語(yǔ)法很簡(jiǎn)單,使用三個(gè)點(diǎn)號(hào)表示“...”??梢詫⒁粋€(gè)數(shù)組轉(zhuǎn)為用逗號(hào)分隔的參數(shù)序列。
它將可迭代對(duì)象展開到其單獨(dú)的元素中,所謂的可迭代對(duì)象就是任何能用 for of
循環(huán)進(jìn)行遍歷的對(duì)象,例如:數(shù)組、字符串、Map
、Set
、DOM
節(jié)點(diǎn)等。
var array = [1,2,3,4]; console.log(...array);//1 2 3 4 var str = "String"; console.log(...str);//S t r i n g
function push(array, ...items) { array.push(...items); } function add(x, y) { return x + y; } const numbers = [4, 38]; add(...numbers) // 42
上面代碼中,array.push(...items)
和add(...numbers)
這兩行,都是函數(shù)的調(diào)用,它們都使用了擴(kuò)展運(yùn)算符。該運(yùn)算符將一個(gè)數(shù)組,變?yōu)閰?shù)序列。
const arr = [ ...(x > 0 ? ['a'] : []), 'b', ];
如果擴(kuò)展運(yùn)算符后面是一個(gè)空數(shù)組,則不產(chǎn)生任何效果。
[...[], 1] // [1]
擴(kuò)展運(yùn)算符還有許多用法...
const m = Math.max(1, 2, 3); //結(jié)果為3
但如果要計(jì)算數(shù)組里的最大值,顯然數(shù)組是不能直接作為 Math.max() 的參數(shù),我們需要把它展開。在ES6之前,我們也是需要結(jié)合apply來(lái)處理:
var arr = [2, 4, 8, 6, 0]; function max(arr) { return Math.max.apply(null, arr); } console.log(max(arr));
ES6使用擴(kuò)展運(yùn)算符(...)就很簡(jiǎn)單就可以展開,上面的例子變?yōu)椋?/p>
var arr = [2, 4, 8, 6, 0]; console.log(Math.max(...arr)); // 3
擴(kuò)展運(yùn)算符給了我們?nèi)碌暮喜?shù)組的方法
// ES5 apply 寫法 var arr1 = [0, 1, 2]; var arr2 = [3, 4, 5]; Array.prototype.push.apply(arr1, arr2); //arr1 [0, 1, 2, 3, 4, 5]
使用擴(kuò)展運(yùn)算符就可以很簡(jiǎn)單地把數(shù)組展開為參數(shù)列表
const a1 = [{ foo: 1 }]; const a2 = [{ bar: 2 }]; const a3 = a1.concat(a2); const a4 = [...a1, ...a2]; a3[0] === a1[0] // true a4[0] === a1[0] // true
上面代碼中,a3
和a4
是用兩種不同方法合并而成的新數(shù)組,但是它們的成員都是對(duì)原數(shù)組成員的引用,這就是淺拷貝。如果修改了引用指向的值,會(huì)同步反映到新數(shù)組。
注意:這兩種方法都是淺拷貝,使用的時(shí)候需要注意。
數(shù)組是復(fù)合的數(shù)據(jù)類型,直接復(fù)制的話,只是復(fù)制了指向底層數(shù)據(jù)結(jié)構(gòu)的指針,而不是克隆一個(gè)全新的數(shù)組。
ES5 只能用變通方法來(lái)復(fù)制數(shù)組。
const a1 = [1, 2]; const a2 = a1.concat(); a2[0] = 2; a1 // [1, 2]
上面代碼中,a1
會(huì)返回原數(shù)組的克隆,再修改a2
就不會(huì)對(duì)a1
產(chǎn)生影響。
擴(kuò)展運(yùn)算符提供了復(fù)制數(shù)組的簡(jiǎn)便寫法。
//拷貝數(shù)組 var array0 = [1,2,3]; var array1 = [...array0]; console.log(array1);//[1, 2, 3] //拷貝數(shù)組 var obj = { age:1, name:"lis", arr:{ a1:[1,2] } } var obj2 = {...obj}; console.log(obj2);//{age: 1, name: "lis", arr: {…}}
記?。簲?shù)組仍通過(guò)指針得到,所以我們并沒有復(fù)制數(shù)組本身,我們復(fù)制的只是一個(gè)新的指針。
NodeList
對(duì)象是節(jié)點(diǎn)的集合,通常是由屬性,如Node.childNodes
和方法,如document.querySelectorAll
返回的。
像 NodeList 和 arguments 這種偽數(shù)組,類似于數(shù)組,但不是數(shù)組,沒有 Array
的所有方法,例如find
、map
、filter
等,但是可以使用 forEach()
來(lái)迭代
可以通過(guò)擴(kuò)展運(yùn)算符將其轉(zhuǎn)為數(shù)組,如下:
const nodeList = document.querySelectorAll(".row"); const nodeArray = [...nodeList]; console.log(nodeList); console.log(nodeArray);
注意:使用擴(kuò)展運(yùn)算符將偽數(shù)組轉(zhuǎn)換為數(shù)組有局限性,這個(gè)類數(shù)組必須得有默認(rèn)的迭代器且偽可遍歷的
擴(kuò)展運(yùn)算符可以與解構(gòu)賦值結(jié)合起來(lái),用于生成數(shù)組
// ES5 a = list[0], rest = list.slice(1) // ES6 [a, ...rest] = list
下面是另外一些例子:
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ò)
ES6的擴(kuò)展語(yǔ)法可以很簡(jiǎn)單的把一個(gè)字符串分割為單獨(dú)字符的數(shù)組:
[...'hello'] // [ "h", "e", "l", "l", "o" ]
擴(kuò)展運(yùn)算符內(nèi)部調(diào)用的是數(shù)據(jù)結(jié)構(gòu)的 Iterator 接口,因此只要具有 Iterator 接口的對(duì)象,都可以使用擴(kuò)展運(yùn)算符,比如 Map 結(jié)構(gòu)。
let map = new Map([ [1, 'one'], [2, 'two'], [3, 'three'], ]); let arr = [...map.keys()]; // [1, 2, 3]
Generator 函數(shù)運(yùn)行后,返回一個(gè)遍歷器對(duì)象,因此也可以使用擴(kuò)展運(yùn)算符。
var go = function*(){ yield 1; yield 2; yield 3; }; [...go()] // [1, 2, 3]
上面代碼中,變量go
是一個(gè) Generator 函數(shù),執(zhí)行后返回的是一個(gè)遍歷器對(duì)象,對(duì)這個(gè)遍歷器對(duì)象執(zhí)行擴(kuò)展運(yùn)算符,就會(huì)將內(nèi)部遍歷得到的值,轉(zhuǎn)為一個(gè)數(shù)組。
如果對(duì)沒有 Iterator 接口的對(duì)象,使用擴(kuò)展運(yùn)算符,將會(huì)報(bào)錯(cuò)。
const obj = {a: 1, b: 2}; let arr = [...obj]; // TypeError: Cannot spread non-iterable object
感謝各位的閱讀,以上就是“ES6中的擴(kuò)展運(yùn)算符怎么使用”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)ES6中的擴(kuò)展運(yùn)算符怎么使用這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。