溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

ES6中的擴(kuò)展運(yùn)算符怎么使用

發(fā)布時(shí)間:2022-08-08 15:08:55 來(lái)源:億速云 閱讀:150 作者:iii 欄目:web開發(fā)

這篇文章主要講解了“ES6中的擴(kuò)展運(yùn)算符怎么使用”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“ES6中的擴(kuò)展運(yùn)算符怎么使用”吧!

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ù)組、字符串、MapSetDOM節(jié)點(diǎn)等。

基礎(chǔ)語(yǔ)法

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

該運(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

上面代碼中,array.push(...items)add(...numbers)這兩行,都是函數(shù)的調(diào)用,它們都使用了擴(kuò)展運(yùn)算符。該運(yùn)算符將一個(gè)數(shù)組,變?yōu)閰?shù)序列。

擴(kuò)展運(yùn)算符后面還可以放置表達(dá)式

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

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

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

擴(kuò)展運(yùn)算符還有許多用法...

一、 替代數(shù)組的 apply 方法

使用 Math.max() 函數(shù)來(lái)獲取最大值的用法是:

const m = Math.max(1, 2, 3); //結(jié)果為3

使用 apply 方法結(jié)合 Math.max():

但如果要計(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)算符的應(yīng)用

1. 合并數(shù)組

擴(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

上面代碼中,a3a4是用兩種不同方法合并而成的新數(shù)組,但是它們的成員都是對(duì)原數(shù)組成員的引用,這就是淺拷貝。如果修改了引用指向的值,會(huì)同步反映到新數(shù)組。

注意:這兩種方法都是淺拷貝,使用的時(shí)候需要注意。

2. 拷貝數(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è)新的指針。

3. 將偽數(shù)組轉(zhuǎn)換為數(shù)組

NodeList 對(duì)象是節(jié)點(diǎn)的集合,通常是由屬性,如 Node.childNodes 和方法,如 document.querySelectorAll 返回的。

像 NodeList 和 arguments 這種偽數(shù)組,類似于數(shù)組,但不是數(shù)組,沒有 Array 的所有方法,例如find、mapfilter 等,但是可以使用 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)的迭代器且偽可遍歷的

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

擴(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ò)

5. 字符串

ES6的擴(kuò)展語(yǔ)法可以很簡(jiǎn)單的把一個(gè)字符串分割為單獨(dú)字符的數(shù)組:

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

6.Map 和 Set 結(jié)構(gòu),Generator 函數(shù)

擴(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)注!

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

es6
AI