ES2023 ~ ES2019 新特性

191 阅读4分钟

今天跟大家讲下 ES2023 ~ ES2019 新特性总结*

 微信扫一扫 关注微信公众号阿勇学前端

ES2023

新增两个方法:.findLast()、.findLastIndex() 从数组的最后一个元素开始查找,可以同 find()、findIndex() 做一个对比

const arr = [{value: 1}, {value: 2}, {value: 3}, {value: 4}];  
  
// find vs findLast  
console.log(arr.find(n => n.value % 2 === 1)); // { value: 1 }  
console.log(arr.findLast(n => n.value % 2 === 1)); // { value: 3 }  
  
// findIndex vs findLastIndex  
console.log(arr.findIndex(n => n.value % 2 === 1)); // 0  
console.log(arr.findLastIndex(n => n.value % 2 === 1)); // 2

Hashbang 语法

例如文件内有这个语法 我们之间运行这个文件

console.log("ayong");

$ ./index.js  
./index.js: line 1: syntax error near unexpected token `"JavaScript"'  
./index.js: line 1: `console.log("JavaScript");'

很正常,因为我们并没有指定使用何种解释器来执行上述脚本文件。Hashbang 语法是用来指定脚本文件的解释器是什么,语法规则是在脚本文件头部增加一行代码:#!/usr/bin/env node。

// #!/usr/bin/env nodeconsole.log("ayong");

注意,还需修改脚本文件的权限 chmod +x index.js,否则执行会报 permission denied: ./index.js 错误。

ES2022

class 私有化类成员:支持私有实例、私有静态类型字段、私有方法。列举实例

class MyClass {  
#privateField; // 使用井号(#)开头的命名约定  
  
constructor() {  
this.#privateField = 'Private Value';  
}  
  
getPrivateField() {  
return this.#privateField;  
}  
}  
  
const myInstance = new MyClass();  
console.log(myInstance.getPrivateField()); // 输出:Private Value  
console.log(myInstance.#privateField); // 错误:无法访问私有字段

私有静态字段(Private Static Fields):

class MyClass {  
static #privateStaticField; // 使用井号(#)开头的命名约定  
  
static setPrivateStaticField(value) {  
MyClass.#privateStaticField = value;  
}  
  
static getPrivateStaticField() {  
return MyClass.#privateStaticField;  
}  
}  
  
MyClass.setPrivateStaticField('Private Static Value');  
console.log(MyClass.getPrivateStaticField()); // 输出:Private Static Value  
console.log(MyClass.#privateStaticField); // 错误:无法访问私有静态字段

私有方法(Private Methods):

class MyClass {  
#privateMethod() { // 使用井号(#)开头的命名约定  
console.log('Private Method');  
}  
  
publicMethod() {  
this.#privateMethod();  
}  
}  
  
const myInstance = new MyClass();  
myInstance.publicMethod(); // 输出:Private Method  
myInstance.#privateMethod(); // 错误:无法访问私有方法

私有字段检查使用 in 操作符检测某一实例是否包含要检测的私有字段。

class Person {  
#name = 'Ergonomic brand checks for Private Fields';  
static check(obj) {  
return #name in obj;  
}  
}

Top-level await以前 await 必须随着 async 一起出现,只有在 async 函数内才可用。当需要在一些文件顶部进行初始化的场景中使用时就有不支持了,顶级 await 可以解决这个问题,但它仅支持 ES Modules。

let jQuery;  
try {  
jQuery = await import('https://cdn-a.com/jQuery');  
} catch {  
jQuery = await import('https://cdn-b.com/jQuery');  
}

.at() 操作符根据指定索引获取数组元素,不同的是它支持传递负数,例如 -1 获取最后一个元素。

const str = '阿勇学前端';str.at(-1)//等价于 str[str.length - 1]

Object.hasOwn(): Object.hasOwn() 方法用于检查对象自身是否具有指定的属性,而不考虑原型链。

const obj = { prop: 'value' };  
console.log(Object.hasOwn(obj, 'prop')); // 输出:true  
console.log(Object.hasOwn(obj, 'toString')); // 输出:false

Error Cause: Error Cause 是指 Error 对象的一个新属性,它提供了关于错误产生原因的更详细的信息。

try {  
// 产生一个错误  
throw new Error('Something went wrong');  
} catch (error) {  
console.log(error.cause); // 输出:undefined(具体的错误原因根据错误对象而定)  
}

ES2021

String.prototype.replaceAll: replaceAll() 是字符串的一个新方法,用于全局替换所有匹配的子字符串。

const str = 'Hello World';const newStr = str.replaceAll('o', '0');console.log(newStr); // 输出:Hell0 W0rld

Promise.any: Promise.any() 是一个新的 Promise 方法,用于接收一个 Promise 数组,并在其中至少一个 Promise 成功时解析。

const promises = [  
fetch('https://api.example.com/data1'),  
fetch('https://api.example.com/data2'),  
fetch('https://api.example.com/data3'),  
];  
  
Promise.any(promises)  
.then((result) => {  
console.log(result); // 输出:首个成功的 Promise 结果  
})  
.catch((error) => {  
console.error(error); // 所有 Promise 都失败时的错误  
});

数字分隔符: 数字分隔符是一种在数字中插入下划线以提高可读性的语法。

const number = 1_000_000;console.log(number); // 输出:1000000

Class Static Block: 类的静态块是一种在类中定义静态成员的方式,它在类的定义中位于其他静态成员之前执行。

class MyClass {  
static staticField;  
  
static {  
MyClass.staticField = 'Static Value';  
console.log('Static block executed');  
}  
}  
  
console.log(MyClass.staticField); // 输出:Static Value

ES2020

matchAll - 匹配所有String.prototype.matchAll() 会返回正则匹配的所有字符串及其位置,相比于

const str = 'JavaScript'  
const regexp = /a/g  
console.log([...str.matchAll(regexp)]);  
  
// Output:  
[  
   [ 'a', index: 1, input: 'JavaScript', groups: undefined ],  
   [ 'a', index: 3, input: 'JavaScript', groups: undefined ]  
]

空值合并空值合并语法使用 ?? 表示,和 || 这个语法类似,不同的是 ?? 有明确的规定,只有当左侧的值为 null 或 undefined 时才会返回右侧的值,例如,左侧是 0 也会认为是合法的。

const a = 0a || 1 // 1a ?? 1 // 0

全局对象JavaScript 可以运行在不同的环境,浏览器为 window、Node.js 为 global。为了能够统一全局环境变量,引入了 globalThis。

window === globalThis // 浏览器环境global === globalThis // Node.js 环境

ES2019

可选的 catch 参数


try {  
throw new Error('this is not a valid')  
} catch {  
console.error(`error...`);  
}

消除前后空格 ES2019 之前有一个 trim() 方法会默认消除前后空格。新增的 trimStart()、trimEnd() 方法分别用来指定消除前面、后面空格。

 JavaScript '.trim() // 'JavaScript'  
 JavaScript '.trimStart() // 'JavaScript '  
 JavaScript '.trimEnd() // ' JavaScript'

****函数的 toString() 方法函数也可以执行 toString() 方法,它会返回定义的函数体代码,包含注释。

const fn = (a, b) => {
// return a + b value
const c = a + b;
return c;
}
console.log(fn.toString());