首页 > 其他分享 >揭秘ES2021令人兴奋的语言特性

揭秘ES2021令人兴奋的语言特性

时间:2023-09-20 13:11:25浏览次数:42  
标签:const 请求 ES2021 令人兴奋 JSON Promise 使用 揭秘

大家好!我是星辰编程理财。今天我分享一篇关于ES2021(ES12)的文章,它将介绍ES2021的语言特性和功能,包括WeakRefs、Logical assignment operators、Private methods and accessors (class fields)、Promise.allSettled()等等。通过故事形式以及详细的阐述和示例,带领大家一起探索这些特性的用处,作为刚入门的新手,它能让你能够在前端开发中游刃有余。废话不多说,让我们一起探索ES2021的语言特性和功能,开启前端开发的新征程吧!

String.prototype.replaceAll()

我们经常需要对字符串进行替换操作。在 ES2021 中,引入了 String.prototype.replaceAll() 方法,它为我们提供了一种简单而强大的替换字符串的方式。

有一次,我正在开发一个社交媒体应用,用户可以在评论区留言。然而,我们面临一个问题:用户有时会在留言中使用敏感词汇,这严重违反了我们的社区准则。我们需要在用户提交评论后,将敏感词汇替换成星号。

我决定使用 replaceAll() 方法来解决这个问题。首先,我定义了一个敏感词汇数组,包含了一些常见的敏感词汇。然后,当用户提交评论后,我使用 replaceAll() 方法遍历敏感词汇数组,并将评论中的敏感词汇替换成星号。

const sensitiveWords = ['敏感词1', '敏感词2', '敏感词3'];
const comment = '这个评论包含敏感词1和敏感词2,请注意!';

const filteredComment = comment.replaceAll(
  new RegExp(sensitiveWords.join('|'), 'gi'),
  '***'
);

console.log(filteredComment);
// 输出: 这个评论包含***和***,请注意!

通过使用 replaceAll() 方法,我能够轻松地将评论中的敏感词汇替换成了星号,这样就保护了我们的社区环境。这个方法非常简洁高效,让我能够更好地处理用户输入中的敏感内容。

Promise.any()

我们经常需要处理异步操作,而在 ES2021 中,引入了 Promise.any() 方法,它为我们提供了一种更灵活的处理多个 Promise 的方式。

有一次,我正在开发一个电商网站,其中一个功能是展示多个供应商的商品价格,并返回最低价格。我面临的问题是,每个供应商的价格请求都是异步的,我需要等待所有请求完成后,再找出最低价格。

在过去,我通常会使用 Promise.all() 来等待所有请求完成,然后进行价格比较。然而,这种方式有一个缺点,即一旦其中一个 Promise 被拒绝,整个链路就会被拒绝,导致无法获取最低价格。

幸运的是,在 ES2021 中引入了 Promise.any() 方法,它允许我们等待多个 Promise 中的任意一个被解决(resolved),并返回该 Promise 的结果。这为我解决了之前遇到的问题。

让我们来看一下我是如何使用 Promise.any() 方法来获取最低价格的例子:

const fetchPrices = async () => {
  const promises = [
    fetchPriceFromSupplier1(),
    fetchPriceFromSupplier2(),
    fetchPriceFromSupplier3()
  ];

  try {
    const lowestPrice = await Promise.any(promises);
    console.log(`最低价格是:${lowestPrice}`);
  } catch (error) {
    console.error('获取价格失败:', error);
  }
};

fetchPrices();

通过使用 Promise.any() 方法,我可以并行地发起多个价格请求,并在任何一个请求成功后立即获取到最低价格。这让我能够更高效地处理异步操作,并且不会受到某个请求失败的影响。

WeakRefs

我们经常需要处理对象的引用和内存管理。在 ES2021 中,引入了 WeakRefs 特性,它为我们提供了一种更好地处理弱引用的方式。

有一次,我正在开发一个图片库应用,用户可以上传图片并进行管理。然而,由于图片占用内存较大,我需要在用户不再需要某张图片时,自动释放内存。这样可以避免内存泄漏和浪费。

在过去,我通常会使用手动引用计数的方式来管理对象的引用和内存释放,但这种方式很容易出错,而且不够灵活。幸运的是,ES2021 引入了 WeakRefs,它为我解决了这个问题。

让我们来看一下我是如何使用 WeakRefs 来管理图片对象的例子:

class Image {
  constructor(url) {
    this.url = url;
    this.#ref = new WeakRef(this);
  }

  async load() {
    // 加载图片逻辑
  }

  release() {
    if (this.#ref.deref() === this) {
      // 释放图片内存
    }
  }
}

const image = new Image('https://example.com/image.jpg');
image.load();

// 用户不再需要这张图片
image.release();

通过使用 WeakRefs,我可以在图片对象不再被其他地方引用时,自动释放图片的内存。这样我就能够更好地管理内存,避免内存泄漏和浪费。

Logical assignment operators (||=, &&=, ??=)

我经常需要在处理变量赋值时进行一些逻辑操作。在 ES2021 中,引入了三个新的逻辑赋值运算符:||=&&=??=

有一天,我正在开发一个任务管理应用,用户可以创建任务并设置任务的状态。每当用户完成一个任务时,我需要将任务的状态标记为已完成。以前,我通常会使用条件语句来实现这个逻辑:

if (!task.status) {
  task.status = 'completed';
}

然而,这种方式显得冗长而且不够简洁。幸运的是,在 ES2021 中,我可以使用逻辑赋值运算符来简化这个过程:

task.status ||= 'completed';

通过使用 ||= 运算符,我可以在 task.status 为假值(如 nullundefined)时,将其赋值为 'completed'。这让我的代码更加简洁、易读,并且减少了冗余的条件判断。

类似地,&&= 运算符可以用于在变量为真值时进行赋值操作,而 ??= 运算符则可以用于在变量为 nullundefined 时进行赋值操作。这些逻辑赋值运算符让我能够以更简洁的方式处理变量赋值的逻辑,提升了代码的可读性和维护性。

Numeric separators

我经常需要处理大量的数字,例如金额、电话号码等。在 ES2021 中,引入了数字分隔符特性,它为我们提供了一种更可读且易于理解的数字表示方式。

有一次,我正在开发一个电商网站,其中一个功能是显示商品的价格。商品价格通常是一个较大的数字,例如 10000000,这种表示方式不够直观,不容易阅读。为了提高用户体验,我想将商品价格以更易读的方式呈现出来。

幸运的是,在 ES2021 中,我可以使用数字分隔符来增加数字的可读性。使用下划线 _ 作为数字分隔符,我可以将这个较大的数字表示为:10_000_000。这样的表示方式更加直观,让用户能够更容易地理解和识别数字的大小。

除了较大的数字外,数字分隔符还可以用于其他场景,例如电话号码、信用卡号码等。通过使用数字分隔符,我可以将这些长数字以一种更可读的方式展示给用户,提高了用户体验和界面的友好性。

Private methods and accessors (class fields)

我经常需要创建和维护复杂的类结构,以实现面向对象的编程。在 ES2021 中,引入了私有方法和访问器(私有字段)的特性,它为我们提供了一种更好地封装和保护类的内部实现细节的方式。

有一次,我正在开发一个音乐播放器应用,其中一个关键的类是 Player 类,用于控制音乐的播放。在过去,这个类的所有方法都是公开的,无论是用于内部使用的还是供外部调用的。这导致类的内部实现细节暴露给了外部,不够安全和可维护。

幸运的是,在 ES2021 中,我可以使用私有方法和访问器来解决这个问题。通过在方法名或字段名前加上 # 符号,我可以将它们标记为私有的,只能在类的内部进行访问。这样,我就能够更好地封装类的内部逻辑,保护了实现细节,同时提供了更清晰的接口供外部调用。

让我们来看一下我是如何使用私有方法和访问器的例子:

class Player {
  #currentSong;

  constructor() {
    // 初始化播放器
  }

  #playSong() {
    // 播放当前歌曲
  }

  play() {
    this.#playSong();
  }

  #pauseSong() {
    // 暂停当前歌曲
  }

  pause() {
    this.#pauseSong();
  }
}

const player = new Player();
player.play();

通过使用私有方法和访问器,我可以将播放器类的内部实现细节隐藏起来,只暴露出必要的公共接口。这样,我可以更好地封装和保护类的内部逻辑,提高了代码的安全性和可维护性。

Promise.allSettled()

我们经常需要处理多个 Promise 对象,并在它们全部解决或拒绝后进行相应的操作。在 ES2021 中,引入了 Promise.allSettled() 方法,它为我们提供了一种更灵活和全面的处理多个 Promise 的方式。

有一次,我正在开发一个电商网站,其中一个功能是展示多个供应商的商品信息。我需要同时向多个供应商的 API 发送请求,并在所有请求完成后,获取每个供应商的商品信息。

在过去,我通常会使用 Promise.all() 方法来等待所有请求完成,并在所有请求成功后获取结果。然而,这种方式有一个缺点,即一旦其中一个请求失败,整个链路就会被拒绝,导致无法获取其他请求的结果。

幸运的是,在 ES2021 中引入了 Promise.allSettled() 方法,它允许我们等待多个 Promise 的状态全部被解决,并返回一个包含每个 Promise 结果的数组,无论是成功还是失败。这为我解决了之前遇到的问题。

让我们来看一下我是如何使用 Promise.allSettled() 方法来获取多个供应商的商品信息的例子:

const fetchProductInfo = async () => {
  const promises = [
    fetchProductInfoFromSupplier1(),
    fetchProductInfoFromSupplier2(),
    fetchProductInfoFromSupplier3()
  ];

  const results = await Promise.allSettled(promises);

  const productInfo = results.map(result => {
    if (result.status === 'fulfilled') {
      return result.value;
    } else {
      return { error: result.reason };
    }
  });

  console.log(productInfo);
};

fetchProductInfo();

通过使用 Promise.allSettled() 方法,我可以并行地发起多个请求,并在所有请求完成后获取每个请求的结果。无论请求是成功还是失败,我都能够获取到对应的结果,而不会因为其中一个请求的失败而导致整个链路被拒绝。

在这个故事中,Promise.allSettled() 方法为我提供了一种更灵活、更全面的处理多个 Promise 的方式。我感到非常激动和满意,因为它帮助我更好地处理异步操作,提升了代码的健壮性和可靠性。

Well-formed JSON.stringify()

我们经常需要将 JavaScript 对象转换为 JSON 字符串,以便在网络传输或存储时进行数据交换。在 ES2021 中,引入了 Well-formed JSON.stringify() 特性,它为我们提供了一种更可靠的方式来序列化 JavaScript 对象。

有一次,我正在开发一个社交媒体应用,用户可以发布帖子并分享到其他平台。为了实现这个功能,我需要将帖子对象转换为 JSON 字符串,并将其发送到其他平台的 API。

在过去,我通常会使用 JSON.stringify() 方法来将对象转换为 JSON 字符串。然而,这种方式存在一些问题,特别是在处理特殊字符时。有时候,JSON.stringify() 方法会生成一些不符合规范的 JSON 字符串,导致在其他平台上解析失败。

幸运的是,在 ES2021 中引入了 Well-formed JSON.stringify() 特性,它确保了生成的 JSON 字符串始终符合规范。这让我可以更加放心地将 JavaScript 对象转换为 JSON 字符串,并进行数据交换。

让我们来看一下我是如何使用 Well-formed JSON.stringify() 特性将帖子对象转换为 JSON 字符串的例子:

const post = {
  id: 1,
  title: 'Hello, world!',
  content: 'This is a sample post.'
};

const jsonString = JSON.stringify(post, null, 2);

console.log(jsonString);

通过使用 Well-formed JSON.stringify() 特性,我可以生成一份符合规范的 JSON 字符串,其中包括缩进和换行。这让我能够更好地阅读和调试生成的 JSON 字符串,同时确保了在其他平台上的解析成功。

AggregateError

我们经常需要处理多个 Promise 的错误。在 ES2021 中,引入了 AggregateError 类型,它为我们提供了一种更好地处理多个错误的方式。

有一次,我正在开发一个电商网站,其中一个功能是展示多个供应商的商品信息。我需要同时向多个供应商的 API 发送请求,并在有错误发生时进行相应的处理。

在过去,我通常会使用 Promise.all() 方法来等待所有请求完成,并在有错误发生时抛出一个通用的错误。然而,这种方式无法提供更详细的错误信息,也无法区分不同的错误来源。

幸运的是,在 ES2021 中引入了 AggregateError 类型,它允许我们创建一个聚合错误对象,包含了多个错误的详细信息。这为我解决了之前遇到的问题。

让我们来看一下我是如何使用 AggregateError 类型来处理多个供应商请求的错误的例子:

const fetchProductInfo = async () => {
  const promises = [
    fetchProductInfoFromSupplier1(),
    fetchProductInfoFromSupplier2(),
    fetchProductInfoFromSupplier3()
  ];

  try {
    await Promise.all(promises);
  } catch (error) {
    if (error instanceof AggregateError) {
      for (const subError of error) {
        console.error(subError);
      }
    } else {
      console.error(error);
    }
  }
};

fetchProductInfo();

通过使用 AggregateError 类型,我可以捕获到多个请求的错误,并逐个处理每个错误。这样我就能够提供更详细的错误信息,区分不同的错误来源,并进行相应的处理。

最后:希望这些内容能够帮助你更好地理解和应用这些特性。如果你还有其他问题,欢迎继续提问!

标签:const,请求,ES2021,令人兴奋,JSON,Promise,使用,揭秘
From: https://www.cnblogs.com/xcbclc/p/17717060.html

相关文章

  • Vue3 watch揭秘:基本用法与原理深度解析
    Vue3中的watch函数用于监听数据的变化,当数据发生变化时,可以执行一些操作。watch函数的基本用法如下:import{ref,watch}from'vue';exportdefault{setup(){constcount=ref(0);watch(count,(newValue,oldValue)=>{console.log(`count的新值为:${......
  • 【原创】135、137、138、139、445端口大揭秘
        我是一位名不见经传的凡人小鲜肉一枚,本来不想作自我介绍一翻,但是每次又总想以这样的方式和大家打声招呼,就像冯巩每次一见到大家,不都是:我想死你们了!是的,我是龙少一郎,今天我要为大家带来端口大揭秘,看看常用的135、137、138、139、445端口在平时的电脑系统中有什么样的非......
  • FX110网:揭秘融商环球骗局!竟拿着黑平台Top Wealth当令箭
    近日,有汇友向我站爆料称融商环球后台登录不上,他尝试着电话、社交平台等各种渠道联系平台方,均联系不上,他也无法出金......到底是怎么回事?本文便来扒一扒融商环球这一平台。融商环球不过是拿着鸡毛当令箭事实上,早在2019年8月,FX110便已将融商环球纳入虚假交易商警示名单,当时曝光的域......
  • 汇率之谜:揭秘黄金折算与真实人民币汇率的神秘差距
    导言:人民币是中国的官方货币,其汇率在国际贸易和金融市场中扮演着至关重要的角色。然而,观察到黄金折算的人民币汇率与真实人民币汇率之间存在显著差距。本文将探讨这一差距的原因以及它所暗示的经济现象。汇率基础知识:首先,让我们了解一下汇率的基础知识。汇率是一种货币相对于另......
  • ES14新特性揭秘,对前端开发有哪些影响?
    ECMAScript2023也就是ES14已经发布3个月了,还有好多小伙伴没有关注到ES14有哪些变化,本文将为大家梳理下ES14最新规范新增功能:对数组的新增功能,对shebang的支持,对弱引用集合的符号键的扩展。这个版本的都是一些细微的改进,我们一起看看有哪些变更目录Array.prototype.toSortedAr......
  • 欢迎来到小码哥的博客 博客搬家啦 blog.ma6174.com 西邮Linux小组免试题揭秘
    还记得东京大学情报理工学系的招生海报吗?只要答对了问题,然后你就被录取了。当时可火了,人人和微博疯狂转载。如今西邮Linux小组也搞了个这样题目,只要你能答对,就能免试进入西邮Linux小组!感觉挺好玩,遂挑战一把。题目原文在这里:http://www.xiyoubbs.com/thread-81454-1-1.html第......
  • 揭秘10个Chat Emy兼职赚钱策略
    在当今数字时代,创造一个有利可图的副业从未如此便利。随着科技的发展,强大的AI语言模型ChatEmy为那些希望增加额外收入的个人开辟了新的途径。在这份全面的指南中,我们将探讨利用ChatEmy潜力的十种巧妙策略,打造您自己的副业帝国。1、利用ChatEmy进行特定领域创作将Cha......
  • 最高提升10倍性能!揭秘火山引擎ByteHouse查询优化器实现方案
     更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 作为企业级数据库的核心组件之一,查询优化器的地位不可忽视。对于众多依赖数据分析的现代企业来说,一个强大且完善的查询优化器能够为数据管理和分析工作带来巨大的便利。 作为火山引......
  • YashanDB混合存储大揭秘:行式存储设计如何为高效TP业务保驾护航(上)
    上一篇文章《揭秘YashanDB融合存储引擎》https://mp.weixin.qq.com/s/yipJcEAH3fVA-_hnUvOiKA从存储结构、事务引擎、高可用等方面介绍了YashanDB存储引擎的整体架构。本篇为大家详细解读YashanDB行式存储技术。背景数据库底层组织数据的方式主要分为行式存储和列式存储两大类。Yas......
  • YashanDB混合存储大揭秘:行式存储设计如何为高效TP业务保驾护航
    接上篇内容插入性能优化YashanDB行式存储主要从提供并发度、批量化处理以及减少日志产生三方面对事务处理过程中的插入性能进行了优化:1提高并发度单线程插入的速度是有限的,在资源充足的场景下,我们希望通过增加线程来提高导入数据的速度。由于数据块不能同时写入,如果两个线程要在同......