自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

讓人愛不釋手的 JS 擴(kuò)展操作符13種寫法

開發(fā) 前端
擴(kuò)展操作符給我最大的印象就是,這玩意還挺方便的,然而最近寫代碼的時(shí)候經(jīng)常性的遇到需要使用擴(kuò)展操作符的場(chǎng)景,所以我干脆在網(wǎng)上找了些資料,把平時(shí)常見的應(yīng)用場(chǎng)景給羅列了下,發(fā)現(xiàn)這個(gè)操作符是真的強(qiáng)大,有多強(qiáng)大?來看看下面這些用法吧。

[[377080]]

 我相信你一定或多或少的接觸或使用過 JS 中的擴(kuò)展操作符(Spread Operator),在基本形式中,擴(kuò)展操作符看起來像三個(gè)點(diǎn),比如如下這樣:

  1. [...arr] 

而實(shí)際上,它也就是這么用的,但是如果事情有這么簡(jiǎn)單,就不用我在這里寫了。擴(kuò)展操作符給我最大的印象就是,這玩意還挺方便的,然而最近寫代碼的時(shí)候經(jīng)常性的遇到需要使用擴(kuò)展操作符的場(chǎng)景,所以我干脆在網(wǎng)上找了些資料,把平時(shí)常見的應(yīng)用場(chǎng)景給羅列了下,發(fā)現(xiàn)這個(gè)操作符是真的強(qiáng)大,有多強(qiáng)大?來看看下面這些用法吧。

1. 字符串轉(zhuǎn)數(shù)組

字符串轉(zhuǎn)數(shù)組最普遍的做法是這樣:

  1. let str = 'hello' 
  2. let arr = str.split(''
  3. console.log(arr)  // ['h''e''l''l''o'

而使用了擴(kuò)展操作符后可以這樣:

  1. let str = 'hello' 
  2. let arr = [...str] 
  3. console.log(arr)  // ['h''e''l''l''o'

2. 將類數(shù)組轉(zhuǎn)換為數(shù)組

在 JS 中有一種數(shù)據(jù)結(jié)構(gòu)叫做 NodeList,它和數(shù)組很相似,也被叫做“類數(shù)組”,類數(shù)組是什么?在 MDN 中是這么定義它的:

  • “類數(shù)組:擁有一個(gè) length 屬性和若干索引屬性的任意對(duì)象。

類數(shù)組有哪些呢?以下這些可以看成是類數(shù)組:

  • NodeList:document.querySelectorAll() 返回的對(duì)象;
  • HTMLCollection:document.getElementsByTagName() 返回的對(duì)象;
  • Arguments:函數(shù)里的參數(shù)對(duì)象;

類數(shù)組沒有數(shù)組的一些方法比如 push、map 等,所以經(jīng)常需要將它們轉(zhuǎn)成數(shù)組,而通常我們是這么轉(zhuǎn)化的:

  1. let nodeList = document.querySelectorAll('div'
  2. console.log(nodeList instanceof NodeList)  // true 
  3.  
  4. let arr = Array.apply(null, nodeList) 
  5. console.log(arr instanceof Array)  // true 
  6.  
  7. // 或者 
  8. let arr2 = [].slice.call(nodeList) 
  9. console.log(arr2 instanceof Array)  // true 
  10.  
  11. // 又或者 
  12. let arr3 = Array.from(nodeList) 
  13. console.log(arr3 instanceof Array)  // true 

而有了擴(kuò)展操作符可以這么做:

  1. let nodeList = document.querySelectorAll('div'
  2. let arr = [...nodeList] 
  3. console.log(arr instanceof Array)  // true 

3. 向數(shù)組中添加項(xiàng)

往數(shù)組中添加幾項(xiàng)通常這樣操作:

  1. let arr = [5] 
  2.  
  3. // 從頭部添加 
  4. arr.unshift(1, 2) 
  5. console.log(arr)  // [1, 2, 5] 
  6.  
  7. // 從尾部添加 
  8. arr.push(6, 7) 
  9. console.log(arr)  // [1,2, 5, 6, 7] 
  10.  
  11. // 從任意位置添加 
  12. arr.splice(2, 0, 3, 4) 
  13. console.log(arr)  // [1,2, 3, 4, 5, 6, 7] 

使用擴(kuò)展操作符后:

  1. let arr = [3, 4] 
  2. arr = [1, 2, ...arr, 5, 6] 
  3. console.log(arr)  // [1, 2, 3, 4, 5, 6] 

4. 拷貝數(shù)組和對(duì)象

通??截愐粋€(gè)數(shù)組,可以這么做:

  1. let arr = [1, 3, 5, 7] 
  2. let arr2 = arr.concat() 
  3.  
  4. // 或者 
  5. let arr3 = arr.slice() 
  6. arr[0] = 2 
  7. console.log(arr)   // [2, 3, 5, 7] 
  8. console.log(arr2)  // [1, 3, 5, 7] 
  9. console.log(arr3)  // [1, 3, 5, 7] 

但是有了擴(kuò)展操作符,拷貝數(shù)組就能寫得很簡(jiǎn)單:

  1. let arr = [1, 3, 5, 7] 
  2. let arr2 = [...arr] 
  3. arr[0] = 2 
  4. console.log(arr2)  // [1, 3, 5, 7] 

同樣的,擴(kuò)展操作符還能拷貝對(duì)象??截悓?duì)象的通常做法:

  1. let person = { name'布蘭', age: 12} 
  2. let p2 = Object.assign({}, person) 
  3. person.age = 20 
  4. console.log(person)  // { name'布蘭', age: 20 } 
  5. console.log(p2)      // { name'布蘭', age: 12 } 

有了擴(kuò)展操作符,拷貝一個(gè)對(duì)象就相當(dāng)方便了:

  1. let person = { name'布蘭', age: 12 } 
  2. let p2 = {...person} 
  3. person.age = 20 
  4. console.log(person)  // { name'布蘭', age: 20 } 
  5. console.log(p2)      // { name'布蘭', age: 12 } 
  6.  
  7. // 甚至還可以這么寫 
  8. let {...p3} = person 
  • “注意:擴(kuò)展操作符只能深拷貝結(jié)構(gòu)為一層的對(duì)象,如果對(duì)象是兩層的結(jié)構(gòu),那么使用擴(kuò)展操作符拷貝會(huì)是淺拷貝。

5. 合并數(shù)組或?qū)ο?/span>

數(shù)組合并通常是這么做的:

  1. let arr1 = [1, 3, 5] 
  2. let arr2 = [2, 4, 6] 
  3. let arr3 = arr1.concat( arr2 ) 
  4. console.log(arr3)  // [1, 3, 5, 2, 4, 6] 

使用擴(kuò)展操作符后,可以這么寫:

  1. let arr1 = [1, 3, 5] 
  2. let arr2 = [2, 4, 6] 
  3. let arr3 = [...arr1, ...arr2] 
  4. console.log(arr3)  // [1, 3, 5, 2, 4, 6] 

對(duì)了,它除了能合并數(shù)組外還能合并對(duì)象呢。合并對(duì)象,通常的做法是:

  1. let p1 = { name'布蘭' } 
  2. let p2 = { age: 12 } 
  3. let p3 = Object.assign({}, p1, p2) 
  4. console.log(p3)  // { name'布蘭', age: 12} 

用擴(kuò)展操作符合并對(duì)象:

  1. let p1 = { name'布蘭' } 
  2. let p2 = { age: 12 } 
  3. let p3 = { ...p1, ...p2 } 
  4. console.log(p3)  // { name'布蘭', age: 12} 

6. 解構(gòu)對(duì)象

經(jīng)常我們給對(duì)象設(shè)置參數(shù)的時(shí)候會(huì)這么做:

  1. let person = { 
  2.     name'布蘭'
  3.     age: 12, 
  4.     sex: 'male' 
  5. let name = person.name 
  6. let age = person.age 
  7. let sex = person.sex 

而有了擴(kuò)展操作符,我們就可以這么寫,不過其實(shí)如下這種寫法并不是擴(kuò)展操作符的寫法🤣,而是剩余操作符的寫法,雖然寫出來后看起來差不多,但就在操作對(duì)象這一點(diǎn)上,基本上可以認(rèn)為它和擴(kuò)展操作符是相反的操作,擴(kuò)展操作符是用來展開對(duì)象的屬性到多個(gè)變量上,而剩余操作符是用來把多個(gè)參數(shù)凝聚到一個(gè)變量上。

  1. let person = { 
  2.     name'布蘭'
  3.     age: 12, 
  4.     sex: 'male' 
  5. let { name, ...reset } = person 
  6. console.log(name)   // '布蘭' 
  7. console.log(reset)  // { age: 12, sex: 'male' } 

7. 給對(duì)象添加屬性

給對(duì)象加屬性通常這樣加:

  1. let person = { name'布蘭' } 
  2. person.age = 12 
  3. console.log(person)  // { name'布蘭', age: 12 } 

使用擴(kuò)展操作符給對(duì)象添加屬性:

  1. let person = { name'布蘭' } 
  2. person = {...person, age: 12} 
  3. console.log(person)  // { name'布蘭', age: 12 } 

關(guān)于使用擴(kuò)展操作符給對(duì)象添加屬性,這里有 2 個(gè)小技巧:

1.給新對(duì)象設(shè)置默認(rèn)值:

  1. // 默認(rèn) person 對(duì)象的 age 屬性值 為 12 
  2. let person = {age: 12, ...{ name'布蘭' } } 
  3. console.log(person)  // { age: 12, name'布蘭' }  

2.重寫對(duì)象屬性

  1. let person = { name'布蘭', age: 12 } 
  2.  
  3. // person 對(duì)象的 age 屬性被重寫為 20 
  4. person = {...person, age: 20 } 
  5. console.log(person)  // { name'布蘭', age: 20 } 

8. 設(shè)置對(duì)象 Getter

設(shè)置對(duì)象 Getter 通常做法是這樣:

  1. let person = { name'布蘭' } 
  2. Object.defineProperty(person, 'age', { 
  3.     get() { return 12 }, 
  4.     enumerable: true
  5.     configurable: true 
  6. }) 
  7. console.log(person.age)  // 12 

而有了擴(kuò)展操作符后可以這么寫:

  1. let person = { name'布蘭' } 
  2. person = { 
  3.     ...person,  
  4.     get age() { return 12 } 
  5. console.log(person.age)  // 12 

9. 將數(shù)組作為函數(shù)參數(shù)展開

如果我們有一個(gè)形參是多個(gè)參數(shù)的函數(shù),但是當(dāng)調(diào)用的時(shí)候發(fā)現(xiàn)入?yún)s是一個(gè)數(shù)組,常規(guī)做法是這樣:

  1. let arr = [1, 3, 5] 
  2. function fn(a, b, c) { }  
  3. fn.apply(null, arr) 

使用擴(kuò)展操作符后,就簡(jiǎn)單多了:

  1. let arr = [1, 3, 5] 
  2. function fn(a, b, c) { }  
  3. fn(...arr) 

10. 無限參數(shù)的函數(shù)

如果有這么一個(gè)累加函數(shù),他會(huì)把所有傳遞進(jìn)來的參數(shù)都加起來,普通做法是把參數(shù)都整合到數(shù)組里,然后這樣做:

  1. function doSum(arr) { 
  2.     return arr.reduce((acc, cur) => acc + cur) 
  3. console.log( doSum([1, 3]) )     // 4 
  4. console.log( doSum([1, 3, 5]) )  // 9 

如果參數(shù)不是數(shù)組,而是需要一個(gè)個(gè)傳遞,相當(dāng)于函數(shù)必須支持無限參數(shù),那可能會(huì)這么做:

  1. function doSum() { 
  2.     let sum = 0 
  3.     for(let i = 0, l = arguments.length; i < l; i++){ 
  4.         sum += arguments[i] 
  5.     } 
  6.     return sum 
  7.      
  8.     // 或者 
  9.     // let args = [].slice.call(arguments)  
  10.     // return args.reduce((acc, cur) => acc + cur) 
  11. console.log( doSum(1, 3) )        // 4 
  12. console.log( doSum(1, 3, 5) )     // 9 
  13. console.log( doSum(1, 3, 5, 7) )  // 16 

而有了擴(kuò)展操作符,就簡(jiǎn)單多了:

  1. function doSum(...arr) { 
  2.     return arr.reduce((acc, cur) => acc + cur) 
  3. console.log( doSum(1, 3) )        // 4 
  4. console.log( doSum(1, 3, 5) )     // 9 
  5. console.log( doSum(1, 3, 5, 7) )  // 16 

11. 擴(kuò)展函數(shù)的剩余參數(shù)

有的時(shí)候一個(gè)函數(shù)需要傳遞很多的參數(shù),比如小程序頁(yè)面(WePY)的 onLoad 生命周期函數(shù)里就可能有很多別的頁(yè)面?zhèn)鬟f過來的參數(shù),然后還需要在函數(shù)里進(jìn)行一些數(shù)據(jù)初始化工作,這樣一來就會(huì)顯得很臃腫不美觀,比如:

  1. function init(a, b, x, y) { 
  2.     // 進(jìn)行一系列初始化數(shù)據(jù)工作 

而使用了擴(kuò)展操作符后,我們就可以按照業(yè)務(wù)把參數(shù)進(jìn)行解構(gòu),把本該在一個(gè)函數(shù)里進(jìn)行初始化的工作拆分成多個(gè),可以這么做:

  1. function other( x, y ) {} 
  2. function init(a, b, ...restConfig) { 
  3.     // 使用 a 和 b 參數(shù)進(jìn)行操作 
  4.     // 其余參數(shù)傳給原始函數(shù) 
  5.     return other( ...restConfig ) 

12. 結(jié)合 Math 函數(shù)使用

比如當(dāng)需要對(duì)一個(gè)數(shù)組求最大值的時(shí)候,通常會(huì)這么做:

  1. let arr = [3, 1, 8, 5, 4] 
  2. function max(arr) { 
  3.     return [].concat(arr).sort((a, b) => b - a) 
  4. console.log(max(arr)[0])  // 8 
  5.  
  6. // 或者 
  7. arr.reduce((acc, cur) => Math.max(acc, cur))  // 8 
  8.  
  9. // 又或者 
  10. Math.max.apply(null, arr)  // 8 

但是使用擴(kuò)展操作符后,能夠把給數(shù)組求最大值寫得更加簡(jiǎn)潔:

  1. let arr = [3, 1, 8, 5, 4] 
  2. let max = Math.max(...arr) 
  3. console.log(max)  // 8 

13. 在 new 表達(dá)式中使用

假設(shè)有一個(gè)數(shù)組格式的日期,想要通過 Date 構(gòu)造函數(shù)創(chuàng)建一個(gè)日期實(shí)例的話,可能會(huì)這么做:

  1. let arr = [2021, 1, 1] 
  2. let date = new Date([].toString.call(arr)) 
  3. console.log(date)  // 'Mon Feb 01 2021 00:00:00 GMT+0800 (中國(guó)標(biāo)準(zhǔn)時(shí)間)' 
  4.  
  5. // 或者 
  6. let date2 = new (Function.prototype.bind.apply( 
  7.     Date,  
  8.     [null].concat(arr) 
  9. )) 
  10. console.log(date2)  // 'Mon Feb 01 2021 00:00:00 GMT+0800 (中國(guó)標(biāo)準(zhǔn)時(shí)間)'  

而有了擴(kuò)展操作符就簡(jiǎn)單多了:

  1. let arr = [2021, 1, 1] 
  2. let date = new Date(...arr) 
  3. console.log(date)  // 'Mon Feb 01 2021 00:00:00 GMT+0800 (中國(guó)標(biāo)準(zhǔn)時(shí)間)' 

總結(jié)

這個(gè)操作符真可謂使用簡(jiǎn)單無腦,但是功能效率上不得不說很強(qiáng)大,所以我們要做的就是只要記住在什么時(shí)候使用它就好了,于是乎為了讓大家能更好的記住這 13 種使用場(chǎng)景,我特意做了一個(gè)圖,方便大家記憶,是不是很貼?。以上這些只列了 13 種寫法,我覺得作為一個(gè)這么強(qiáng)大的操作符,肯定有更多使用的場(chǎng)景。


 

責(zé)任編輯:姜華 來源: 大海我來了
相關(guān)推薦

2009-08-29 08:41:07

Windows 7新功能

2011-09-16 09:06:20

Smalltalk

2021-02-02 21:42:30

VS Code編輯器開發(fā)

2021-01-18 09:55:46

Spring代碼Java

2010-12-08 09:59:10

CSS

2021-04-25 10:15:38

Python編程語(yǔ)言軟件包

2021-04-13 10:07:08

Python軟件包編程語(yǔ)言

2021-12-09 13:30:17

微軟

2011-03-31 14:22:28

Chrome插件

2021-01-24 11:55:40

spring升華代碼的技巧開發(fā)

2024-07-24 08:33:06

JavaScript匯編語(yǔ)言

2011-05-12 09:12:16

Ubuntu 11.0

2017-05-24 18:00:13

AndroidAndroid DatView

2013-05-06 22:52:10

智能手機(jī)交互方式用戶體驗(yàn)

2024-12-17 15:00:00

Python代碼

2016-05-05 10:54:53

Android開發(fā)應(yīng)用

2023-07-04 08:19:25

IDEA插件

2021-01-11 08:21:34

spring升華代碼的技巧開發(fā)

2020-11-03 15:10:55

Spring Batc框架Java

2023-07-18 08:46:34

開發(fā)必備軟件工具
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)