1. 程式人生 > 實用技巧 >ES2020新特性記錄

ES2020新特性記錄

1.可選鏈操作符

// old
let ret = obj && obj.first && obj.first.second
// new
let ret = obj?.first?.second

2.空位合併操作符

// old
let c = a ? a : b
let c = a || b
// new 如果表示式在??的左側運算子求值為undefined 或 null,就返回其右側預設值。 (0, false 標示有效值)
let c = a ?? b

3.Promise.allSettled

Promise.all 具有併發執行非同步任務的能力。但它的最大問題就是如果引數中的任何一個promise為reject的話,則整個Promise.all 呼叫會立即終止,並返回一個reject的新的 Promise 物件。 Promise.allSettled跟Promise.all類似, 其引數接受一個Promise的陣列, 返回一個新的Promise, 唯一的不同在於, 它不會進行短路
, 也就是說當Promise全部處理完成後,我們可以拿到每個Promise的狀態, 而不管是否處理成功。

4.String.prototype.matchAll

old

function collectGroup1 (regExp, str) {
  const matches = []
  while (true) {
    const match = regExp.exec(str)
    if (match === null) break
    matches.push(match[1])
  }
  return matches
}
console.log(collectGroup1(/"([^"]*)"/g, `"foo" and "bar" and "baz"`))
// [ 'foo', 'bar', 'baz' ]

 new 

function collectGroup1 (regExp, str) {
  let results = []
  for (const match of str.matchAll(regExp)) {
    results.push(match[1])
  }
  return results
}
console.log(collectGroup1(/"([^"]*)"/g, `"foo" and "bar" and "baz"`))
// ["foo", "bar", "baz"]

5.Dynamic import

el.onclick = () => {
  import('/modules/my-module.js')
    .then(module => {
      // Do something with the module.
    })
    .catch(err => {
      // load error;
    })
}

let module = await import('/modules/my-module.js');

6.BigInt

建立 BigInt 型別的值也非常簡單,只需要在數字後面加上 n 即可

const aNumber = 111;
const aBigInt = BigInt(aNumber);
aBigInt === 111n // true
typeof aBigInt === 'bigint' // true
typeof 111 // "number"
typeof 111n // "bigint"

在大多數操作中,不能將 BigInt與Number混合使用。比較Number和 BigInt是可以的,但是不能把它們相加。

1n < 2 
// true

1n + 2
// Uncaught TypeError: Cannot mix BigInt and other types, use explicit conversions

7.globalThis

// ES10之前的解決方案
const getGlobal = function(){
  if(typeof self !== 'undefined') return self
  if(typeof window !== 'undefined') return window
  if(typeof global !== 'undefined') return global
  throw new Error('unable to locate global object')
}

// ES10內建
globalThis.Array(0,1,2) // [0,1,2]

// 定義一個全域性物件v = { value:true } ,ES10用如下方式定義
globalThis.v = { value:true }

globalThis 目的就是提供一種標準化方式訪問全域性物件