美文网首页
从ES2016到ES2023,八个版本更新速览

从ES2016到ES2023,八个版本更新速览

作者: microkof | 来源:发表于2023-03-08 22:43 被阅读0次

前言

就根据这个表,我把要点都列一下,还不会的赶紧学起来吧。

image.png

ES2016

指数运算

至今未用到过,略。

Array.prototype.includes

很好用,现在数组和字符串都支持这个方法。

ES2017

async/await

史诗级API,可以看我的:

异步编程终极大法async/await入门

await/async如何优雅捕获错误是该有个结论了

函数最后一个参数尾部支持逗号

优点:

  • 参数可以分行写,分行注释

  • git标记变化更直观,毕竟分行了

然而,在编辑器自带格式化的当前大环境下,这个特性你可以不去管。

Object.getOwnPropertyDescriptors

业务开发用不到,框架开发用得到。

String.prototype.{padStart,padEnd}

  • padStart()的常见用途是为数值补全指定位数。下面代码生成 10 位的数值字符串。
'1'.padStart(10, '0') // "0000000001"
'12'.padStart(10, '0') // "0000000012"
'123456'.padStart(10, '0') // "0000123456"
  • padStart()还可以将字符串自身加入到模板的后部中,这样如果数据源格式不统一,处理之后可以变成统一的:
'09-12'.padStart(10, '2023-MM-DD') // "2023-09-12"
'2023-09-12'.padStart(10, '2023-MM-DD') // "2023-09-12"
  • padEnd()也是这样的思路。

Object.values/Object.entries

常用,收集对象的键值为数组,然后遍历数组。

ES2018

异步迭代( for await of)

虽然用的少,但是该用的时候必须用。

Promise.prototype.finally

超级好用。

正则表达式支持 unicode 属性

需要你对unicode字符有深入了解,不常用。

正则表达式反向肯定(否定) 预查(?<= 和 ?<!)

JS的正则终于快要接近完全体了,喜讯!

扩展运算符

神器级增强。

正则表达式命名组

不常用,除非你的业务经常需要玩正则。

原本正则匹配是:

const RE_DATE = /(\d{4})-(\d{2})-(\d{2})/;
const matchObj = RE_DATE.exec('1999-12-31');
const year = matchObj[1]; // 1999
const month = matchObj[2]; // 12
const day = matchObj[3]; // 31

这里有几个缺点:

  • 要找到一个分组的位置,你必须要去数括号的位置,有时嵌套起来会更令人头疼。
  • 后面维护代码的同学阅读起来,还要根据下标找到正则里面对应的括号,并且要再次阅读括号里面的正则才知道含义。
  • 当你调整正则捕获分组的数量、顺序或嵌套时,你必要还要对下面的代码做调整。

说白了,用下标就很弱智。

现在:

const RE_DATE = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/;
const matchObj = RE_DATE.exec('1999-12-31');
const year = matchObj.groups.year; // 1999
const month = matchObj.groups.month; // 12
const day = matchObj.groups.day; // 31

差别在于:(\d{4})变成了(?<year>\d{4}),也就是在括号的开头增加了?<year>,这就给分组加上了有意义的标记,以后按照matchObj.groups.year就绝对错不了了。

正则表达式点号匹配任何字符

其实是说有些特殊字符从前不支持,现在支持了,好事。

ES2019

Array.prototype.{flat,flatMap)

数组降维操作,该用就用,挺爽的。

String.prototype.{trimStart,trimEnd)

只删除头部或尾部空白字符,不常用,但真用的时候挺好用。

合理的JSON.stringify

还是针对unicode的,也就是补了补漏洞。知道有这事就行了。

Object.fromEntries

是Object.entries(obj)的逆方法。用于将符合要求的数组转成对象,也可以用于将Map转为对象。

Function.prototype.toString() 修正

从ES2019开始,Function.prototype.toString()将从头到尾返回源代码中的实际文本片段。这意味着还将返回注释、空格和语法详细信息。但一般无卵用。

Symbol.prototype.description

业务中连Symbol都很少用,这个可以不管。

.catch()可以不传参数

知道就行了,编辑器一般会告诉你可以不写。

ES2020

import.meta

一般在底层框架中有用到,具体解释可以看 https://www.bookstack.cn/read/es6-3rd/spilt.10.docs-proposals.md,在业务中,你也可以具体了解一下并巧妙使用它。

空值合并运算符( 比如 : a = b ?? “default")

类似于||,但是??的左侧只判断是否为nullundefined,不判断其他值,如果是0则返回0,空串也返回空串,false也返回false

var x = 0 || 15;
console.log(x); // 15
var y = 0 ?? 15;
console.log(y); // 0

var x = false || 15;
console.log(x); // 15
var y = false ?? 15;
console.log(y); // false

可选链(比如 : a?.b )

很棒的新特性,是对连缀的增强。

var ob = {a: 1};
console.log(ob.b.c); // 错误
var ob = {a: 1};
console.log(ob.b?.c); // undefined

globalThis

统一Node.js环境和浏览器环境的根对象。

Promise.allSettled

Promise.all只有全部成功才会进入then(),现在Promise.allSettled无论成功失败都会进入.then()。

BigInt

大整型,它是新增的基本数据类型,用于工业、银行之类领域的大数计算。

JS整数范围是[-2^53, 2^53],即[-9007199254740991,9007199254740991],在这个范围之外就是失真。你可以判断一下某个数是否失真:

Number.isSafeInteger(9007199254740991); //  true
Number.isSafeInteger(9007199254740992); // false

大整型用尾部加n表示:

var x = 11111111111111111111111111111111111111111n;
var y = x + 1n;
console.log(x); // 11111111111111111111111111111111111111111n
console.log(y); // 11111111111111111111111111111111111111112n

其他细节不多说。

import()

模块异步加载,返回Promise。

String.prototype.matchAll

matchAll不完全是match + /g,而是生成一个迭代器。必须用for ... of ...去迭代它。日常不常用。

ES2021

数字分隔符

仅仅是为了让程序员看起来更清晰一点:

let num = 1_000_000;
console.log(num); //output: 1000000

逻辑运算符赋值

也就是这三个:??=&&=||=,其中常用||=,很好用。

  • 最常用的是||=
// 老的写法
user.id = user.id || 1;

// 新的写法
user.id ||= 1;
  • 其次常用的是&&=,其中&&就很罕见,它意思跟||相反,左边为假值就短路取该假值,日常几乎用不到:
var x = 0;
x = x && 3;
console.log(x); // 0
x &&= 3;
console.log(x); // 0

var x = 1;
x = x && 3;
console.log(x); // 3
x &&= 3;
console.log(x); // 3
  • ??=更罕见,是空值合并运算符的运算符赋值。
var x = 0;
x = x ?? 3;
console.log(x); // 0
x ??= 3;
console.log(x); // 0

var x = 1;
x = x ??= 3;
console.log(x); // 1
x ??= 3;
console.log(x); // 1

WeakRef

业务代码几乎不用。

Promise.any

任意一个Promise变成了已解决状态,则立即返回第一个已解决的Promise。

String.prototype.replaceAll

replaceAll()可以在不使用正则表达式的情况下替换字符串中指定的所有字符,有两个参数:初始字符串、需要替换的字符串。

ES2022

异常链

业务代码中没什么用,不要把异常搞的那么复杂。

类静态块

不适用class的话,不需要管。

Object.hasOwn

和hasOwnProperty用途一样,写法有区别,hasOwn是Object的静态方法。它们都用于判断一个属性是否属于一个对象:

let obj = {
    name:'张三',
}
console.log(obj.hasOwnProperty('name')) // true

现在我们可以用Object.hasOwn():

let obj = {
    name:'张三',
}
console.log(Object.hasOwn(obj, 'name')) // true

.at 返回指定索引的元素

支持负值,这就是它的唯一好处。

// 返回 4
[1, 2, 3, 4].at(-1)

顶层 await

function fn() {
    return Promise.resolve();
}

// 以前需要通过 IIFE 实现
(async function () {
    await fn();
})();

// 支持顶层 await 后,可以直接调用
await fn();

正则表达式切片 /d

通过正则匹配,我们只能拿到匹配到的字符串,通过切片,也就是加d,可以拿到这些字符串在原字符串的位置。m1会增加一个属性叫indices,里面会标记每一个匹配项在原字符串的位置。

const re1 = /a+(z)?/d;
const s1 = "xaaaz";
const m1 = re1.exec(s1);
console.log(m1);

ES2023

数组新增4个非破坏性方法

目前有4个方法可以不修改原数组,只生成新数组。

arr.toSorted() 可接收比较函数
arr.toReversed() 无参数
arr.toSpliced() splice()是返回被删除的元素,而这个是返回删完之后的样子
arr.with(index, ‘新值’) 相当于先按下标赋值,然后返回修改后的新数组

const array = ['c', 'o', 'n', 'a', 'r', 'd', 'l', 'i'];
const result = array.toSorted();
console.log(array); // 不变
console.log(result);

其他不再举例。

WeakMap 支持 Symbol 作为 key

不多说。

Hashbang 语法

是Node.js专用语法,用于指定用哪个本地程序运行该js文件。下方代码表示用环境变量下的node指向的程序来执行本JS文件。

#!/usr/bin/env node
console.log('hashbang');

这样直接在命令行敲本文件的文件名,就会执行JS。

findLast / findLastIndex

从数组尾部开始查找,findLast会返回找到的第一个,findLastIndex会返回找到的第一个的下标,而且是负值。

相关文章

网友评论

      本文标题:从ES2016到ES2023,八个版本更新速览

      本文链接:https://www.haomeiwen.com/subject/srroldtx.html