首页 > 其他分享 >ES2020新特性

ES2020新特性

时间:2024-04-07 11:05:22浏览次数:23  
标签:undefined level ES2020 特性 JS Promise user let

ES2020新特性

ES2020 已经发布了,一共出9个新特性,下面让我们一起来了解下。

String.prototype.matchAll()

可一次性取出所有匹配,但是返回的是一个遍历器(Iterator),而非数组。可以用for of循环取出。相对于返回数组,返回遍历器的好处在于,如果遍历结果是一个很大的数组,那么遍历器比较节省资源。遍历器转换成数组,也是比较方便,可以使用...运算符和Array.from()就可以了。

let str = '<text>JS</text><text>正则</text>';

let reg = /<\w+>(.*?)<\/\w+>/;  // 注意这里没有全局搜素标示符“g”

str.match(reg);
/*
=>
[
  0: "<text>JS</text>"
  1: "JS"
  groups: undefined
  index: 0
  input: "<text>JS</text><text>正则</text>"
  length: 2
  [[Prototype]]: Array(0)
]
*/

这样可以获取到匹配的父项,包括子项(group),但只能获取到第一个满足的匹配字符。能看出上面无法匹配到正则
如果获取到全局所有匹配项,包括子项呢?
ES2020提供了一种简易的方式:String.prototype.matchAll, 该方法会返回一个迭代器。

let str = '<text>JS</text><text>正则</text>';
let allMatchs = str.matchAll(/<\w+>(.*?)<\/\w+>/g);

for (const match of allMatchs) {
  console.log(match);
}

/*
第一次迭代返回:
[
  0: "<text>JS</text>"
  1: "JS"
  groups: undefined
  index: 0
  input: "<text>JS</text><text>正则</text>"
  length: 2
  [[Prototype]]: Array(0)
]

第二次迭代返回:
[
  0: "<text>正则</text>"
  1: "正则"
  groups: undefined
  index: 15
  input: "<text>JS</text><text>正则</text>"
  length: 2
  [[Prototype]]: Array(0)
]
*/

能看出每次迭代中可获取所有的匹配,以及本次匹配的成功的一些其他元信息。

dynamic-import

按需 import 提案几年前就已提出,如今终于能进入ES正式规范。这里个人理解成“按需”更为贴切。现代前端打包资源越来越大,打包成几M的JS资源已成常态,而往往前端应用初始化时根本不需要全量加载逻辑资源,为了首屏渲染速度更快,很多时候都是按需加载,比如懒加载图片等。而这些按需执行逻辑资源都体现在某一个事件回调中去加载。

el.onclick = () => {
    import(`/path/current-logic.js`)
    .then((module) => {
        module.doSomthing();
    })
    .catch((err) => {
        // load error;
    })
}

BigInt

Js 中 Number类型只能安全的表示-(2^53-1)至 2^53-1 范的值,即Number.MIN_SAFE_INTEGERNumber.MAX_SAFE_INTEGER,超出这个范围的整数计算或者表示会丢失精度。

let num = Number.MAX_SAFE_INTEGER;  // -> 9007199254740991

num = num + 1; // -> 9007199254740992

// 再次加 +1 后无法正常运算
num = num + 1; // -> 9007199254740992

// 两个不同的值,却返回了true
9007199254740992 === 9007199254740993  // -> true

Promise.allSettled()

Promise.all 缺陷

都知道 Promise.all 具有并发执行异步任务的能力。但它的最大问题就是如果其中某个任务出现异常(reject),所有任务都会挂掉,Promise直接进入 reject 状态。
想象这个场景:你的页面有三个区域,分别对应三个独立的接口数据,使用 Promise.all 来并发三个接口,如果其中任意一个接口服务异常,状态是reject,这会导致页面中该三个区域数据全都无法渲染出来,因为任何 reject 都会进入catch回调, 很明显,这是无法接受的,如下:

Promise.all([
    Promise.reject({code: 500, msg: '服务异常'}),
    Promise.resolve({ code: 200, list: []}),
    Promise.resolve({code: 200, list: []})
])
.then((ret) => {
    // 如果其中一个任务是 reject,则不会执行到这个回调。
    RenderContent(ret);
})
.catch((error) => {
    // 本例中会执行到这个回调
    // error: {code: 500, msg: "服务异常"}
})

我们需要一种机制,如果并发任务中,无论一个任务正常或者异常,都会返回对应的的状态(fulfilled 或者 rejected)与结果(业务value 或者 拒因 reason),在 then 里面通过 filter 来过滤出想要的业务逻辑结果,这就能最大限度的保障业务当前状态的可访问性,而 Promise.allSettled 就是解决这问题的。

Promise.allSettled([
    Promise.reject({code: 500, msg: '服务异常'}),
    Promise.resolve({ code: 200, list: []}),
    Promise.resolve({code: 200, list: []})
])
.then((ret) => {
    /*
        0: {status: "rejected", reason: {…}}
        1: {status: "fulfilled", value: {…}}
        2: {status: "fulfilled", value: {…}}
    */
    // 过滤掉 rejected 状态,尽可能多的保证页面区域数据渲染
    RenderContent(ret.filter((el) => {
        return el.status !== 'rejected';
    }));
});

globalThis

Javascript 在不同的环境获取全局对象有不通的方式,node 中通过 global, web中通过 window, self 等,有些甚至通过 this 获取,但通过 this 是及其危险的,this 在 js 中异常复杂,它严重依赖当前的执行上下文,这些无疑增加了获取全局对象的复杂性。
过去获取全局对象,可通过一个全局函数

let 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'); 
}; 

let globals = getGlobal(); 

// https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/globalThis

而 globalThis 目的就是提供一种标准化方式访问全局对象,有了 globalThis 后,你可以在任意上下文,任意时刻都能获取到全局对象。

for-in 机制

ECMAScript 遗留了 for-in 循环顺序的详尽介绍待填补。Kevin Gibbons 为此悉心付出,为 for-in 机制定义了一套规则,感谢他。

可选链

可选链 可让我们在查询具有多层级的对象时,不再需要进行冗余的各种前置校验。
日常开发中,我们经常会遇到这种查询

let name = user && user.info && user.info.name;

又或是这种

let age = user && user.info && user.info.getAge && user.info.getAge();

这是一种丑陋但又不得不做的前置校验,否则很容易命中 Uncaught TypeError: Cannot read property... 这种错误,这极有可能让你整个应用挂掉。
用了 Optional Chaining ,上面代码会变成

let name = user?.info?.name;
let age = user?.info?.getAge?.();

可选链中的 ? 表示如果问号左边表达式有值, 就会继续查询问号后面的字段。根据上面可以看出,用可选链可以大量简化类似繁琐的前置校验操作,而且更安全。

空值合并运算符

当我们查询某个属性时,经常会遇到,如果没有该属性就会设置一个默认的值。比如下面代码中查询玩家等级。

let level =  user.data.level || '暂无等级';

在JS中,空字符串、0 ,当进行逻辑操作符判时,会自动转化为 false。在上面的代码里,如果玩家等级本身就是 0 级, 变量 level 就会被赋值 暂无等级 字符串,这是逻辑错误,有时候业务上,我们只需容错取值查询到undefined 或者 null ,比如:

// {
//    "level": null
// }
let level = user.level !== undefined && user.level !== null
            ? user.level
            : '暂无等级';
来看看用空值合并运算符如何处理
// {
//   "level": 0   
// }
let level = user.level ?? '暂无等级'; // level -> 0
// {
//   "an_other_field": 0   
// }
let level = user.level ?? '暂无等级'; // level -> '暂无等级'

用空值合并运算在逻辑正确的前提下,代码更加简洁。
空值合并运算符 与 可选链 相结合,可以很轻松处理多级查询并赋予默认值问题。

let level = user.data?.level ?? '暂无等级';

import.meta

import.meta 会返回一个对象,有一个 url 属性,返回当前模块的url路径,只能在模块内部使用。

//src/index.js
import React from 'react';
console.log(import.meta);//{index.js:38 {url: "http://127.0.0.1:3000/src/index.js"}}

标签:undefined,level,ES2020,特性,JS,Promise,user,let
From: https://www.cnblogs.com/ameng666/p/18118622

相关文章

  • ES2016新特性
    ES2016新特性本次更新改变的内容比较少,仅仅新增了includes()方法和简化幂运算的写法。Array.prototype.includesincludes()方法用来判断一个数组是否包含一个指定的值,根据情况,如果包含则返回true,否则返回false。[1,2,3].includes(2);//true[1,2,3].includes(4);//......
  • MC14516BDR2G倒数计数器芯片中文资料PDF数据手册参数引脚图图片特性概述
    产品概述:MC14516B同步正数/倒数二进制计数器在一个单片结构中使用MOSP沟道和N沟道增强模式器件构造。此计数器可通过对预设输入(P0、P1、P2、P3)应用所需的二进制值,然后将预设启用(PE)置于高电平,来进行预设。计数方向通过向UP/DOWN输入应用高电平(用于正数)或低电平(用于......
  • 深入理解C++ lambda表达式:用法、特性与最佳实践
    文章目录一、引言1、lambda表达式的概念2、lambda表达式在C++中的重要作用3、lambda表达式的基本语法结构二、lambda表达式的核心特性1、捕获列表2、参数列表3、返回类型4、函数体5、multable关键字三、lambda表达式的进阶用法1、lambda表达式与STL算法的结合使用2、la......
  • CAT809JTBI-GT3中文资料规格书PDF数据手册引脚图产品参数特性概述
    产品概述:CAT809是一款µP监督电路,监控数字系统中的电源。CAT809可在基于工业温度范围运行的应用中直接替代MAX809。此器件会产生重置信号,当电源电压降至阈值阈值以下且电源升至该水平140ms之后发出该信号。安森美半导体使用的底层浮动门极技术AE²™可用于提供任......
  • MC14516BDR2G倒数计数器芯片中文资料PDF数据手册参数引脚图图片特性概述
    产品概述:MC14516B同步正数/倒数二进制计数器在一个单片结构中使用MOSP沟道和N沟道增强模式器件构造。此计数器可通过对预设输入(P0、P1、P2、P3)应用所需的二进制值,然后将预设启用(PE)置于高电平,来进行预设。计数方向通过向UP/DOWN输入应用高电平(用于正数)或低电平(用于......
  • rust 面向对象编程特性、模式与模式匹配、高级特征
    面向对象编程OOP学习了结构体、枚举,它们可以包含自定义数据字段,也可以定义内部方法,它们提供了与对象相同的功能。面向对象的四大特征:封装、继承、多态通过pub标记为公有的结构体,在其他模块中可以访问使用这个结构体。但是对于结构体内部字段,如果不用pub,则仍是私有的,则可以通过......
  • 前端系列-HTML5新特性
      HTML5引入了许多新特性和改进,其中包括但不限于:语义化标签:新增了像 <header>、<footer>、<nav>、<article>、<section> 和 <aside> 等元素,用于更好地表现文档结构。表单增强:添加了新的输入类型,如 type="email"、type="url"、type="date" 等,并支持 required、place......
  • C#–特性详解
    一、特性是什么1、特性定义特性(Attribute)是用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。您可以通过使用特性向程序添加声明性信息。一个声明性标签是通过放置在它所应用的元素前面的方括号([])来描述的。特性(Attribute)用于添加元数......
  • 特性与反射
    性与反射特性特性(Attribute)是用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。您可以通过使用特性向程序添加声明性信息。一个声明性标签是通过放置在它所应用的元素前面的方括号([])来描述的。特性(Attribute)用于添加元数据,如编译器指......
  • React19 新特性 – 附带代码示例的更新
    ReactJS是前端开发世界中最流行的UI库之一。我喜欢React的原因之一就是它背后的团队以及社区对它的热情。当社区提出对新功能和改进的需求时,团队会倾听。React的未来令人兴奋而有趣。如果我必须用一句话来总结,我会说这几乎概括了一切:“少写代码,多实现功能。”在本......