当前位置:主页 > 查看内容

ES 2021新特性提前知,附案例

发布时间:2021-06-29 00:00| 位朋友查看

简介:简介 ES2021 也就是 2021 年的 ECMAScript 版本。ES2021 并没有像 ES2015 那样提出很多新特性,但却合并了一些有用的特性。 本文将会用通俗易懂的代码示例来介绍 ES2021 的新特性。当然在这之前,你需要了解 JavaScript 的基础知识。 以下是 ES2021 的新特性……

 

简介

ES2021 也就是 2021 年的 ECMAScript 版本。ES2021 并没有像 ES2015 那样提出很多新特性,但却合并了一些有用的特性。

本文将会用通俗易懂的代码示例来介绍 ES2021 的新特性。当然在这之前,你需要了解 JavaScript 的基础知识。

以下是 ES2021 的新特性概览:

  •  String.prototype.replaceAll
  •  Promise.any
  •  WeakRef
  •  逻辑赋值运算符
  •  数字分隔符

String.protype.replaceAll

在 ES2021 之前,要替换掉一个字符串中的所有指定字符,我们可以这么做:

  1. const fruits = '🍎+🍐+🍓+' 
  2. const fruitsfruitsWithBanana = fruits.replace(/\+/g, '🍌');  
  3. console.log(fruitsWithBanana); //🍎🍌🍐 

ES2021 则提出了 replaceAll 方法,并将其挂载在 String 的原型上,可以这么用:

  1. const fruits = '🍎+🍐+🍓+' 
  2. const fruitsfruitsWithBanana = fruits.replaceAll('+', '🍌');  
  3. console.log(fruitsWithBanana); //🍎🍌🍐🍌🍓🍌 

Promise.any

Promise.any 方法和 Promise.race 类似——只要给定的迭代中的一个 promise 成功,就采用第一个 promise 的值作为它的返回值,但与 Promise.race 的不同之处在于——它会等到所有 promise 都失败之后,才返回失败的值:

  1. const myFetch = url => setTimeout(() => fetch(url), Math.floor(Math.random() * 3000));  
  2. const promises = [  
  3.   myFetch('/endpoint-1'),  
  4.   myFetch('/endpoint-2'),  
  5.   myFetch('/endpoint-3'),  
  6. ];  
  7. // 使用 .then .catch  
  8. Promise.any(promises) // 任何一个 promise 成功。  
  9.        .then(console.log) // 比如 ‘3’  
  10.        .catch(console.error); // 所有的 promise 都失败了  
  11. // 使用 async-await  
  12. try {  
  13.   const first = await Promise.any(promises); // 任何一个 promise 成功返回。  
  14.  console.log(first);  
  15. }catch (error) { // 所有的 promise 都失败了  
  16.   console.log(error);  

WeakRef

WeakRef 提案主要包含两个新功能:

  •  可以通过 WeakRef 类来给某个对象创建一个弱引用
  •  可以通过 FinalizationRegistry 类,在某个对象被垃圾回收之后,执行一些自定义方法

上述两个新功能可以同时使用,也可以单独使用,取决于你的需求。

一个 WeakRef 对象包含一个对于某个对象的弱引用,被称为 目标 或 引用。通过弱引用一个对象,可以让该对象在没有其它引用的情况下被垃圾回收机制回收。

WeakRef 主要用来 缓存 和 映射 一些大型对象,当你希望某个对象在不被其它地方引用的情况下及时地被垃圾回收,那么你就可以使用它。

  1. function toogle(element) {  
  2.   const weakElement = new WeakRef(element);  
  3.   let intervalId = null 
  4.   function toggle() {  
  5.     const el = weakElement.deref();  
  6.     if (!el) {  
  7.        return clearInterval(intervalId);  
  8.    }  
  9.    const decoration = weakElement.style.textDecoration;  
  10.    const styledecoration === 'none' ? 'underline' : 'none';  
  11.    decoration = style 
  12.   }  
  13.   intervalId = setInterval(toggle, 1000);  
  14.  
  15. const element = document.getElementById("link");  
  16. toogle(element);  
  17. setTimeout(() => element.remove(), 10000); 

FinalizationRegistry 接收一个注册器回调函数,可以利用该注册器为指定对象注册一个事件监听器,当这个对象被垃圾回收之后,会触发监听的事件,具体步骤如下。

首先,创建一个注册器:

  1. const registry = new FinalizationRegistry(heldValue => {  
  2.   // .... 
  3. }); 

接着注册一个指定对象,同时也可以给注册器回调传递一些参数:

  1. registry.register(theObject, "some value"); 

逻辑赋值运算符

译者注:赋值运算符 和 表达式 的区别可以 看这里。

逻辑赋值运算符结合了 逻辑运算符 和 赋值表达式。逻辑赋值运算符有两种:

  •  或等于(||=)
  •  且等于(&&=) 
  1. // 或等于  
  2. |   a   |   b   | a ||= b | a (运算后) |  
  3. | true  | true  |   true  |        true         |  
  4. | true  | false |   true  |        true         |  
  5. | false | true  |   true  |        true         |  
  6. | false | false |   false |        false        |  
  7. a ||= b  
  8. // 等同于:  
  9. a || (a = b);  
  10. // 且等于  
  11. |   a   |   b   | a &&= b | a (运算后) |  
  12. | true  | true  |   true  |        true         |  
  13. | true  | false |   false |        false        |  
  14. | false | true  |   false |        false        |  
  15. | false | false |   false |        false        |  
  16. a &&= b  
  17. // 等同于:  
  18. a && (a = b); 

数字分隔符

通过这个功能,我们利用 “(_,U+005F)” 分隔符来将数字分组,提高数字的可读性:

  1. 1_000_000_000           // 十亿  
  2. 101_475_938.38          // 亿万  
  3. const amount = 12345_00;  // 12,345  
  4. const amount = 123_4500;  // 123.45 (保留 4 位小数)  
  5. const amount = 1_234_500; // 1,234,500  
  6. 0.000_001 // 百万分之一  
  7. 1e10_000  // 10^10000  
  8. const binary_literals = 0b1010_0001_1000_0101 
  9. const hex_literals = 0xA0_B0_C0 
  10. const bigInt_literals = 1_000_000_000_000n 
  11. const octal_literal = 0o1234_5670

总结

JavaScript 是一门动态类型语言,这在某些方面来说对于 web 开发是有益的。自 ES2015 之后,JavaScript 正在快速发展。在这篇文章里面,我们着重回顾了 ES2021 的一些新特性。

尽管你的项目可能并不会用到这些新特性,但是它们的确为项目开发提供了多种可能性,不是么?

【责任编辑:庞桂玉 TEL:(010)68476606】
本文转载自网络,原文链接:https://mp.weixin.qq.com/s/7ggArrmQrE89byWsWz-sHQ
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!
上一篇:怎么得到免费企业邮箱 下一篇:没有了

推荐图文


随机推荐