10 個關(guān)于JavaScript Spread Syntax (...)的強大用途

英文 | https://javascript.plainenglish.io/10-powerful-uses-of-spread-syntax-that-youll-love-a3fe70ae503c
翻譯 | 楊小愛
擴展語法—Spread Syntax(…) 是 ES6 中引入的一個新特性,它允許我們從可迭代對象中快速提取元素。使用這種語法,我們可以避免使用大量復(fù)雜的 API,編寫更簡潔的代碼。看完這篇文章,相信你會喜歡這個功能的。
1、復(fù)制一個數(shù)組
復(fù)制數(shù)組的傳統(tǒng)方法是使用數(shù)組的切片方法。
let arr = [1, 2, 3, [4, 5]];let copy = arr.slice()console.log(copy)// [1, 2, 3, [4, 5]];;
但是, slice 方法最初是為了捕獲數(shù)組的片段,而不是復(fù)制它們。這個 API 很容易忘記,但是使用擴展語法非常簡單明了:
2、復(fù)制一個對象
要復(fù)制對象,您可以使用 Object.assign() :
let user = { name: 'bytefish', url: 'https://bytefish.medium.com'}let copy = Object.assign({}, user)console.log(copy);
輸出:
Object {name: "bytefish", url: "https://bytefish.medium.com"}使用擴展語法
let user = { name: 'bytefish', url: 'https://bytefish.medium.com'}let copy = {...user}console.log(copy);
輸出:
Object {name: "bytefish", url: "https://bytefish.medium.com"}使用擴展語法,您可以提取對象的所有可枚舉屬性并將它們添加到新對象中。
3、將元素添加到數(shù)組的開頭或結(jié)尾
在數(shù)組的開頭和結(jié)尾添加元素是一項頻繁的任務(wù),數(shù)組提供了 push 和 unshift 方法:
let arr = [3]arr.unshift(1, 2)arr.push(4, 5)console.log(arr);
輸出:
[1, 2, 3, 4, 5]如果我們使用擴展語法,代碼會更加簡潔易懂:
let arr = [3]let copy = [1, 2, ...arr, 4, 5]console.log(copy);
輸出:
[1, 2, 3, 4, 5]注意:arr.push 和 arr.unshift 修改當(dāng)前數(shù)組,而擴展語法創(chuàng)建一個新數(shù)組。你應(yīng)該根據(jù)自己的需求選擇合適的方法。
4、合并數(shù)組
傳統(tǒng)方式:
let arr1 = [1, 2, 3]let arr2 = [4, 5, 6]let arr3 = arr1.concat( arr2 )console.log(arr3);
使用擴展語法:
let arr1 = [1, 2, 3]let arr2 = [4, 5, 6]let arr3 = [...arr1, ...arr2]console.log(arr3);
輸出
[1, 2, 3, 4, 5, 6]5、合并對象
傳統(tǒng)方式:
let p1 = { name: 'bytefish' }let p2 = { tag: 'JavaScript' }let p3 = Object.assign({}, p1, p2)console.log(p3) ;
輸出
Object {name: "bytefish", tag: "JavaScript"}使用擴展語法:
let p1 = { name: 'bytefish' }let p2 = { tag: 'JavaScript' }let p3 = {...p1, ...p2}console.log(p3) ;
輸出
Object {name: "bytefish", tag: "JavaScript"}6、 將字符串轉(zhuǎn)換為數(shù)組
傳統(tǒng)方式:
let str = 'bytefish'let arr = str.split('')console.log(arr) ;
?輸出
["b", "y", "t", "e", "f", "i", "s", "h"]使用擴展語法:
let str = 'bytefish'let arr = [...str]console.log(arr) ;
輸出
["b", "y", "t", "e", "f", "i", "s", "h"]7、 將類數(shù)組對象轉(zhuǎn)換為數(shù)組
JavaScript 中的一些數(shù)據(jù)結(jié)構(gòu)看起來像數(shù)組但不是數(shù)組,例如 NodeList、函數(shù)的參數(shù)對象等。
與數(shù)組一樣,它們是順序結(jié)構(gòu),其中的元素可以通過索引訪問。但是它們沒有普通數(shù)組的一些屬性和方法。

function sum(){console.log(arguments)console.log(arguments instanceof Array)}sum(1, 2, 3);
輸出
Arguments {0: 1, 1: 2, 2: 3}false
為了使用這些類似數(shù)組的對象,我們有時需要將它們轉(zhuǎn)換為數(shù)組。
傳統(tǒng)方式:
function foo(){let argArray = Array.from(arguments)console.log(argArray instanceof Array)}foo();
輸出:
true使用擴展語法:
function sum(){console.log(arguments)let argArray = [...arguments]console.log(argArray instanceof Array)}sum(1, 2, 3);
Arguments {0: 1, 1: 2, 2: 3}true
在 JavaScript 中,Rest Syntax 和 Spread Syntax 的表示法是相同的,都是用三個點(…)表示。但它們也有一些微妙的區(qū)別:
Rest 語法將所有剩余元素收集到一個數(shù)組或?qū)ο笾小?/span>
擴展語法將收集的元素(例如數(shù)組)解壓縮為單個元素。
這里還有幾個同樣使用Spread Syntax (…)的例子,理論上應(yīng)該屬于 Rest Syntax。雖然Spread語法和Rest語法相似,但我認(rèn)為沒有必要關(guān)心這些概念上的細(xì)微差別。所以我也會在這里放幾個 Rest Syntax 用法的例子。
8、提取對象
假設(shè)有一個對象:
let httpOptions = {method: 'POST',url: 'https://api.github.com',returnType: 'json',timeout: 2000,data: {name: 'bytefish'}}
我們想拿到這個對象的method和url,把其他字段放在一起,怎么辦呢?
使用擴展語法,我們可以這樣寫:

提取這個對象的屬性只需要一行代碼,幾乎找不到更簡潔的寫法。
9、無限參數(shù)的函數(shù)
假設(shè)我們需要編寫一個求和函數(shù),它可以接受任意數(shù)量的參數(shù)并將它們相加。我們?nèi)绾尉帉戇@樣的函數(shù)?
新手程序員可能想知道一個函數(shù)如何可以接受無限數(shù)量的參數(shù)。他可能會使用一個數(shù)組作為參數(shù)并編寫如下內(nèi)容:
function sum(arr){return arr.reduce((acc, cur) => acc + cur)}console.log(sum([1, 2, 3, 4]));
不過這種寫法需要我們把參數(shù)組合成一個數(shù)組來傳遞,不是很優(yōu)雅。一個更好的想法是使用函數(shù)的參數(shù)對象來動態(tài)讀取參數(shù)。
function sum() {let argsArray = Array.from(arguments)return argsArray.reduce((acc, cur) => acc + cur)}console.log( sum(1, 2, 3, 4) ) // 10console.log( sum(1, 3, 5, 7) ) // 16;
如果我們使用擴展語法,我們可以直接將所有參數(shù)組合在一起:
function sum(...arr) {return arr.reduce((acc, cur) => acc + cur)}console.log( sum(1, 2, 3, 4) ) // 10console.log( sum(1, 3, 5, 7) ) // 16;
這樣,無論我們傳遞多少個參數(shù),它們都會被放在 arr 中。這顯然比第一個更優(yōu)雅,也比第二個更方便。
Math.max
許多 JavaScript 內(nèi)置函數(shù)都使用這種技術(shù),例如 Math.max。

如您所見,Math.max 可以接受任意數(shù)量的參數(shù)。
如果我們想獲得數(shù)組中的最大或最小數(shù)字,我們可以這樣寫:
let arr = [23, 34, 53, 3]console.log(Math.max(...arr))console.log(Math.min(...arr));
輸出
533
10、Rest Parameters
除了上面的用法,我們還可以使用rest參數(shù)。假設(shè)我們有一個函數(shù),它的前兩個參數(shù)是固定的,其余參數(shù)是不確定的,所以我們可以這樣寫:
function team(leader, viceLeader, ...members){console.log('leader: ' + leader)console.log('vice leader: ' + viceLeader)members.forEach(member => console.log('member: ' + member))}team('Jon', 'Jack', 'Bob', 'Alice');
輸出
"leader: Jon""vice leader: Jack""member: Bob""member: Alice"
結(jié)論
我們終于學(xué)會了它,在 JavaScript 中使用擴展語法的 10 種方法。我希望你發(fā)現(xiàn)它對你很有用。如果是這樣,請務(wù)必在評論中告訴我。
學(xué)習(xí)更多技能
請點擊下方公眾號
![]()

