成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

這些ES特性你用了嗎?

系統 瀏覽器
今天這篇文章的靈感來自于日常的項目開發,「 我以為vue項目中已經添加了對可選鏈的支持,但在使用的時候會報錯,所以我更新了cli,發現最新版的cli已經對babel進行了更新 ,也就是對ES的新的一些特性已支持 」。

[[385595]]

今天這篇文章的靈感來自于日常的項目開發,「 我以為vue項目中已經添加了對可選鏈的支持,但在使用的時候會報錯,所以我更新了cli,發現最新版的cli已經對babel進行了更新 ,也就是對ES的新的一些特性已支持 」。

簡單的歸納了幾個點:

  • Array新方法find、findIndex、includes、flat等
  • Object新方法entries、fromEntries、Object.getOwnPropertyDescriptors等
  • String新方法padStart、padStart、trimStart、trimEnd、
  • for await of
  • Function.prototype.toString

接下來展開討論一下。

Array

在項目中我們常常會遇到對數組的操作是

  • 數組中判斷是否有該字段
  • 在數組中找到某一對象
  • 多維數組平鋪
  • 拼接、過濾、排序、裁剪、填充等

在ES6中我們判斷一個字符串中是否包含某一個字符,我們可以用includes:

  1. let str = '驚天碼盜'
  2. str.includes('驚天');  
  3. // true 

而在ES7中也加入了對數組的支持

  1. const arr = [1, 3, 5, 2, '8', NaN, -0, undefined] 
  2. arr.includes(1) // true 
  3. arr.includes(1, 2) // false 該方法的第二個參數表示搜索的起始位置,默認為 0 
  4. arr.includes('1') // false 
  5. arr.includes(NaN) // true 
  6. arr.includes(+0) // true 
  7. arr.includes(undefined) // true 

在業務代碼中遇到最多的就是在數組中找到某一對象

  1. const list = [{ id: 1, name'Jok' }, { id: 2, name'Tom' }] 
  2.  
  3. // 判斷list是否存在Tom 
  4. const isHasTome = list.some(e => e.name == "Tom"); 
  5. // true 
  6. const jokItem = list.find(e => e.name == "Tom"); 
  7. // { id: 2, name'Tom' } 
  8. const jokIndex = list.findIndex(e => e.name == "Tom"); 
  9. // 1 
  10.  
  11. // 檢查數組所有元素是否符合指定條件 
  12. const hasPropToName = list.every(e => e.name
  13. // true 檢查每一項是否有name屬性 

在ES10中新增了一個flat方法,將多維數組打平:

  1. const arr = [1, 2, [3, [4, 5], 6], 7] 
  2. arr.flat(); 
  3. // [1, 2, 3, [4, 5], 6, 7] 
  4. arr.flat(2); 
  5. // [1, 2, 3, 4, 5, 6, 7] 
  6.  
  7. //arr.flat(depth) 
  8. // depth 是指定要提取嵌套數組的結構深度,默認值為 1 

在ES6中還有一個比較有意思的API,就是entries

  1. // 數組迭代器 
  2. const iterator = list.entries() 
  3. iterator.next();  
  4. // { done: false, value:[ 0, { id: 1, name'Jok' }] } 
  5. iterator.next();  
  6. // { done: false, value:[ 1, { id: 2, name'Tom' }] } 
  7. iterator.next();  
  8. // { done: true, value: undefined} 

有點類似generator函數。

  1. // 處理promise 
  2. const promiseCase = (p) => { 
  3.   return new Promise(function (resolve, reject) { 
  4.     setTimeout(function () { 
  5.       resolve(`${p}成功`); //代碼正常執行! 
  6.     }, 250); 
  7.   }); 
  8. const asyncList = [promiseCase('p1'), promiseCase('p2'), promiseCase('p3')]; 
  9. const iterator = asyncList.entries(); 
  10. // undefined 
  11. for (let e of iterator) { 
  12.   console.log(e); 
  13.   e[1].then
  14.     res=>console.log(res) 
  15.   ) 
  16.  
  17. // [0, Promise] 
  18. // [1, Promise] 
  19. // [2, Promise] 
  20. // p1成功 
  21. // p2成功 
  22. // p3成功 

Object

ES5引入了Object.keys返回健名。緊跟著ES8引入了Object.values和Object.entries,作為遍歷一個對象的手段,供for of使用。

  1. const obj = { foo: 'bar', baz: 42 }; 
  2. Object.keys(obj) 
  3. // ["foo""baz"
  4. Object.values(obj) 
  5. // ["bar", 42] 
  6. const objEntries = Object.entries(obj) 
  7. // [["foo""bar"], ["baz", 42]] 
  8. Object.fromEntries(objEntries) 
  9. // {foo: "bar", baz: 42} 

也可以用entries來判斷對象中某些值的對比:

  1. const obj = { 
  2.   a: 21, 
  3.   b: 22, 
  4.   c: 23 
  5. let res = Object.fromEntries(Object.entries(obj).filter(([a, b]) => b > 21)) 
  6. console.log(res)  
  7. // {b: 22, c: 23} 

ES5 的 Object.getOwnPropertyDescriptor() 方法會返回某個對象屬性的描述對象(descriptor)。ES8 引入了 Object.getOwnPropertyDescriptors() 方法,返回指定對象所有自身屬性(非繼承屬性)的描述對象。

Object.assign無法正確拷貝get屬性和set屬性,Object.getOwnPropertyDescriptors() 方法配合 Object.defineProperties() 方法,就可以實現正確拷貝。

  1. const source = { 
  2.   set foo (value) { 
  3.     console.log(value) 
  4.   }, 
  5.   get bar () { 
  6.     return '浪里行舟' 
  7.   } 
  8. const target1 = {} 
  9. Object.assign(target1, source) 
  10. console.log(Object.getOwnPropertyDescriptor(target1, 'foo')) 
  11. // undefined 
  12.  
  13. const target2 = {} 
  14. Object.defineProperties(target2, Object.getOwnPropertyDescriptors(source)) 
  15. console.log(Object.getOwnPropertyDescriptor(target2, 'foo')) 
  16. // set: ƒ foo(value) 

String

在 ES8 中 String 新增了兩個實例函數 String.prototype.padStart 和 String.prototype.padEnd,允許將空字符串或其他字符串添加到原始字符串的開頭或結尾。

  1. String.padStart(targetLength,[padString]) 
  2. // targetLength(必填): 當前字符串需要填充到的目標長度。如果這個數值小于當前字符串的長度,則返回當前字符串本身。 
  3. // padString(可選): 填充字符串。如果字符串太長,使填充后的字符串長度超過了目標長度,則只保留最左側的部分,其他部分會被截斷,此參數的缺省值為 " "。 
  4.  
  5. 'x'.padStart(4, 'ab') // 'abax' 
  6. 'x'.padEnd(5, 'ab') // 'xabab' 

在ES10中新增了兩個移除開頭和結尾的空格。

  1. let str = ' 驚天 碼盜 ' 
  2. str.trimStart(); // str.trimLeft(); 
  3. // '驚天 碼盜 ' 
  4. str.trimEnd(); // str.trimRight(); 
  5. // ' 驚天 碼盜' 
  6. str.trim(); 
  7. // '驚天 碼盜' 
  8. str.replace(/\s+/g, '') ; 
  9. // '驚天碼盜' 

for await of

for of方法能夠遍歷具有 Symbol.iterator 接口的同步迭代器數據,但是不能遍歷異步迭代器。ES9 新增的 for await of 可以用來遍歷具有 Symbol.asyncIterator 方法的數據結構,也就是異步迭代器,且會等待前一個成員的狀態改變后才會遍歷到下一個成員,相當于 async 函數內部的 await。

我想大家基本都寫過類似這樣的代碼:

  1. const promiseCase = (p) => { 
  2.   return new Promise(function (resolve, reject) { 
  3.     setTimeout(function () { 
  4.       resolve({ 
  5.         code: 0, 
  6.         name: `${p}` 
  7.       }); //代碼正常執行! 
  8.     }, 250); 
  9.   }); 
  10. const asyncList = [promiseCase('p1'), promiseCase('p2'), promiseCase('p3')]; 
  11. asyncList.forEach(async (e) => { 
  12.   const data = await e; 
  13.   console.log(data) 
  14. }) 
  15. // {code: 0, name"p1"
  16. // {code: 0, name"p2"
  17. // {code: 0, name"p3"

現在可以這樣寫:

 

  1. async function test () { 
  2.   for await (let item of asyncList) { 
  3.     console.log(Date.now(), item) 
  4.   } 
  5. test() 
  6. // 1614935341100 {code: 0, name"p1"
  7. // 1614935341100 {code: 0, name"p2"
  8. // 1614935341100 {code: 0, name"p3"

Function.prototype.toString

ES2019 中,Function.toString() 發生了變化。之前執行這個方法時,得到的字符串是去空白符號的。

而現在,得到的字符串呈現出原本源碼的樣子:

  1. function sum(a, b) { 
  2.   return a + b; 
  3. console.log(sum.toString()); 
  4. // function sum(a, b) { 
  5. // return a + b; 
  6. // } 

本文轉載自微信公眾號「驚天碼盜」,可以通過以下二維碼關注。轉載本文請聯系驚天碼盜公眾號。

 

責任編輯:武曉燕 來源: 驚天碼盜
相關推薦

2014-02-17 10:54:13

PostgreSQL數據庫

2018-05-20 11:01:47

Siri語音助手手機

2023-11-30 08:19:52

偽類CSS

2020-03-20 19:10:37

支付寶新版移動應用

2020-06-23 10:28:30

軟件研發交付

2013-09-02 09:46:46

云計算

2019-11-20 10:38:36

路由路由協議路由器

2016-10-13 19:31:56

大數據應用大數據

2024-09-30 09:28:34

軟件研發交付

2020-10-14 07:52:36

ES11編程語言開發

2009-05-18 10:57:35

.NETString特性

2019-05-20 16:30:36

PythonMySQL存儲

2020-04-14 08:46:47

Java對象編譯器

2020-12-17 08:39:36

Css前端html

2019-08-05 15:05:35

2020-03-05 09:42:43

JavaJava虛擬機數據庫

2009-11-12 16:01:27

2024-03-20 08:31:40

KotlinExtension計算

2018-09-08 09:46:06

數據庫性能優化

2018-10-20 16:05:12

iOSAPP開發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩一区二区三区在线观看 | 天天摸天天看 | 久久久激情视频 | 国产一区二区久久 | 午夜资源 | 久久三区| 日韩视频一区二区 | 天天操夜夜操免费视频 | 精品欧美一区二区久久久伦 | 奇米在线 | 视频一区二区中文字幕 | 久久只有精品 | 日本中文字幕日韩精品免费 | 成人国产精品久久久 | 亚洲一区在线播放 | 国产成人免费视频 | 成人亚洲精品久久久久软件 | 精品国产视频在线观看 | 久久久综合 | 久久精品亚洲一区 | 久久国产一区二区三区 | av在线伊人 | 欧美精品久久久久久 | 国产精品精品3d动漫 | 91精品国产综合久久婷婷香蕉 | 亚洲精品免费视频 | 97中文视频 | 精品一区二区三区免费视频 | 欧美一级大片 | 日韩国产高清在线观看 | 日韩免费视频 | 国产精品网址 | 一级国产精品一级国产精品片 | 97国产精品视频人人做人人爱 | 久久成人av | 成人精品免费视频 | 一级毛片大全免费播放 | www国产成人免费观看视频,深夜成人网 | 中文字幕日韩欧美一区二区三区 | 欧美中文一区 | 亚洲精品久久久一区二区三区 |