【编程指南】ES2016到ES2023新特性解析一网打尽(二)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 【编程指南】ES2016到ES2023新特性解析一网打尽(二)

ES2020

matchAll 匹配所有

字符串的新方法,可以通过正则表达式来查找字符串中的所有匹配项。

想象你有一篇文章,想找出所有包含某个特定单词的地方。matchAll 就像是帮你在文章中找到所有这样的地方

const text = 'Hello world, hello universe';
const regex = /hello/gi;
for (const match of text.matchAll(regex)) {
  console.log(match);
}

模块新特性

  • import 动态导入
    动态导入意思是当你需要该模块时才会进行加载,返回的是一个 Promise 对象。只有在 ES Modules 模块规范下才支持。
// index-a.mjs
export default {
  hello () {
    console.log(`hello JavaScript`);
  }
}
// index-b.mjs
import('./index-a.mjs').then(module {
  module.default.hello(); // hello JavaScript
})
  • import.meta
    import.meta 指当前模块的元数据。一个广泛支持的属性是 import.meta.url,以字符串形式输出当前模块的文件路径。

Bigint

BigInt 是一种新的数据类型,用于表示大整数,超出了 JavaScript 中常见的数值范围。

想象你要表示一个非常大的数字,比如宇宙的年龄。BigInt 就像是一个特别大的数字框,可以容纳更多的数字。

const bigNumber = 1234567890123456789012345678901234567890n;
console.log(bigNumber);

Promise.allSettled

这是 Promise 的一个新方法,可以等待多个 Promise 都完成(无论成功还是失败)后再继续。

const promises = [
  Promise.resolve('Success!'),
  Promise.reject('Error!')
];
Promise.allSettled(promises)
  .then(results => console.log(results));

全局对象

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

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

for-in 机制

这是对 for-in 循环的更新,用于更好地遍历对象的可枚举属性。

想象你要看一个箱子里有什么东西,但有些东西可能隐藏得很深。for-in 机制就像是帮你把箱子里所有东西都拿出来看一遍。

const obj = { a: 1, b: 2, c: 3 };
for (const key in obj) {
  console.log(key, obj[key]);
}

可选链

这是一个新的语法,用于在访问对象的属性时,避免因为属性不存在而导致错误。

const person = {
  name: 'Alice',
  contact: {
    phone: '123-456-7890'
  }
};
const phoneNumber = person?.contact?.phone;
console.log(phoneNumber); // 输出: '123-456-7890'

空值合并

这是一种新的语法,用于给变量赋值时,如果变量的值为 nullundefined,就使用默认值。


想象你要吃冰淇淋,但是不知道哪种口味有,所以你要确保有一种口味可以选。空值合并就像是在选择口味时,如果没有你喜欢的,就选择默认的口味。

const favoriteIceCream = null;
const iceCreamChoice = favoriteIceCream ?? 'Vanilla';
console.log(iceCreamChoice); // 输出: 'Vanilla'

ES2021

String.prototype.replaceAll

字符串的一个新方法,用于替换所有匹配的子字符串。

想象你在纸上写了一句话,但是有一些词你想换成其他词。replaceAll 就像是帮你把所有要换的词都换掉。

const originalText = 'Hello world, hello universe';
const newText = originalText.replaceAll('hello', 'hi');
console.log(newText); // 输出: 'Hi world, hi universe'

Promise.any

Promise.anyPromise 的一个新方法,用于在一组 Promise 中,只要有一个成功就返回,不必等待所有 Promise 都结束。

const promises = [
  Promise.reject('Error 1'),
  Promise.resolve('Success!'),
  Promise.reject('Error 2')
];
Promise.any(promises)
  .then(result => console.log(result))
  .catch(errors => console.error(errors));

数字分隔符

分隔符是一种在数字中插入下划线,以便更易读的语法。

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

逻辑赋值运算符

结合了逻辑运算符 &&、||、?? 和逻辑表达式 =。

// "Or Or Equals" (or, the Mallet operator :wink:)
a ||= b; // a || (a = b);
// "And And Equals"
a &&= b; // a && (a = b);
// "QQ Equals"
a ??= b; // a ?? (a = b);

WeakRefs

WeakRefs 是一种新的对象引用类型,用于创建对对象的弱引用,不会影响对象的垃圾回收。

想象你有一个备忘录,但是只在你需要的时候才能看到。WeakRefs 就像是对对象的一种轻量级引用,不会让对象被保持得太久。

const obj = { data: 'Some data' };
const weakRef = new WeakRef(obj);
// 只有当 obj 还存在时,weakRef 才能获取到它
const retrievedObj = weakRef.deref();
console.log(retrievedObj?.data); // 输出: 'Some data'

ES2022

类私有属性

这是 JavaScript 中类的一个新特性,允许在类内部声明私有属性,仅在类的内部可访问。

想象你有一本笔记本,里面有些笔记是只有你能看到的。类私有属性就像是在类里面写下一些只有类自己能看到的东西。

class Person {
  #name = 'Alice'; // 私有属性
  sayHello() {
    console.log(`Hello, my name is ${this.#name}`);
  }
}
const person = new Person();
person.sayHello(); // 输出: 'Hello, my name is Alice'
console.log(person.#name); // 无法访问私有属性

私有字段检查

一种新的访问控制,允许类的私有属性在外部被访问时触发特定的操作。

想象你的门上装有警报,如果有人试图进入你的房间,会发出声音。私有字段检查就像是在访问私有属性时触发警报。

class BankAccount {
  #balance = 1000; // 私有属性
  #checkAccess() {
    console.log('Access to balance checked');
  }
  get balance() {
    this.#checkAccess();
    return this.#balance;
  }
}
const account = new BankAccount();
console.log(account.balance); // 输出: 'Access to balance checked' 和账户余额

顶层 await

允许在模块顶层使用 await

想象你在工作,需要等一份文件完成才能继续。顶层 await 就像是你在等这份文件,但不需要停下其他的工作。

// 在模块顶层使用 await
const data = await fetchData();
console.log(data);

.at 方法返回指定索引的元素

想象你有一个大盒子,里面有很多东西。.at 方法就像是帮你从盒子中取出特定位置的东西。

const arr = [1, 2, 3, 4, 5];
console.log(arr.at(2)); // 输出: 3
const text = 'Hello';
console.log(text.at(1)); // 输出: 'e'

Object.hasOwn()

一个全局函数,用于检查对象是否具有指定的自有属性。

想象你有一张名单,上面写着一些名字。Object.hasOwn() 就像是帮你查看名单上是否有某个名字。

const person = { name: 'Alice' };
console.log(Object.hasOwn(person, 'name')); // 输出: true
console.log(Object.hasOwn(person, 'age')); // 输出: false

异常链

一种更好地处理异常信息的方式,允许你在异常中包含更多信息。

想象你有一串蛋糕,但其中一个蛋糕有问题。异常链就像是在蛋糕上贴上标签,告诉你哪个蛋糕有问题,以及为什么有问题。

try {
  // 一些可能出错的代码
} catch (error) {
  const detailedError = new Error('详细错误信息');
  detailedError.originalError = error;
  throw detailedError;
}

类静态块

类的一个新特性,允许在类内部定义一块在类被初始化时执行的代码。

想象你在搭建一个房子,房子刚建好时,你想做一些特定的准备工作。类静态块就像是在房子刚建好时,执行一些初始化工作。

class MyClass {
  static {
    console.log('类初始化中...');
  }
  constructor() {
    console.log('实例化对象');
  }
}
const obj = new MyClass();

ES2023

Array 支持从尾部查找

新增两个方法: .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 语法

Hashbang 语法是一种在 URL 中使用 #! 符号,用于标记 Web 应用中的前端路由。


想象你有一本书,但书中有很多章节。你可以用不同的书签快速翻到你想读的章节。Hashbang 语法就像是在 URL 中放了一个特殊的书签,让你能迅速定位到网页的某个部分。

// URL 中的 Hashbang
https://example.com/#!/page1
https://example.com/#!/page2
相关文章
|
3天前
|
存储 缓存 Java
Java 并发编程——volatile 关键字解析
本文介绍了Java线程中的`volatile`关键字及其与`synchronized`锁的区别。`volatile`保证了变量的可见性和一定的有序性,但不能保证原子性。它通过内存屏障实现,避免指令重排序,确保线程间数据一致。相比`synchronized`,`volatile`性能更优,适用于简单状态标记和某些特定场景,如单例模式中的双重检查锁定。文中还解释了Java内存模型的基本概念,包括主内存、工作内存及并发编程中的原子性、可见性和有序性。
Java 并发编程——volatile 关键字解析
|
24天前
|
缓存 Java 调度
多线程编程核心:上下文切换深度解析
在现代计算机系统中,多线程编程已成为提高程序性能和响应速度的关键技术。然而,多线程编程中一个不可避免的概念就是上下文切换(Context Switching)。本文将深入探讨上下文切换的概念、原因、影响以及优化策略,帮助你在工作和学习中深入理解这一技术干货。
39 10
|
1月前
|
编译器 C# 开发者
C# 9.0 新特性解析
C# 9.0 是微软在2020年11月随.NET 5.0发布的重大更新,带来了一系列新特性和改进,如记录类型、初始化器增强、顶级语句、模式匹配增强、目标类型的新表达式、属性模式和空值处理操作符等,旨在提升开发效率和代码可读性。本文将详细介绍这些新特性,并提供代码示例和常见问题解答。
48 7
C# 9.0 新特性解析
|
24天前
|
存储 编译器 C语言
【C语言】数据类型全解析:编程效率提升的秘诀
在C语言中,合理选择和使用数据类型是编程的关键。通过深入理解基本数据类型和派生数据类型,掌握类型限定符和扩展技巧,可以编写出高效、稳定、可维护的代码。无论是在普通应用还是嵌入式系统中,数据类型的合理使用都能显著提升程序的性能和可靠性。
41 8
|
24天前
|
算法 调度 开发者
多线程编程核心:上下文切换深度解析
在多线程编程中,上下文切换是一个至关重要的概念,它直接影响到程序的性能和响应速度。本文将深入探讨上下文切换的含义、原因、影响以及如何优化,帮助你在工作和学习中更好地理解和应用多线程技术。
34 4
|
27天前
|
编译器 PHP 开发者
PHP 8新特性解析与实战应用####
随着PHP 8的发布,这一经典编程语言迎来了诸多令人瞩目的新特性和性能优化。本文将深入探讨PHP 8中的几个关键新功能,包括命名参数、JIT编译器、新的字符串处理函数以及错误处理改进等。通过实际代码示例,展示如何在现有项目中有效利用这些新特性来提升代码的可读性、维护性和执行效率。无论你是PHP新手还是经验丰富的开发者,本文都将为你提供实用的技术洞察和最佳实践指导。 ####
29 1
|
28天前
|
数据安全/隐私保护 iOS开发 开发者
iOS 14隐私保护新特性深度解析####
随着数字时代的到来,隐私保护已成为全球用户最为关注的问题之一。苹果在最新的iOS 14系统中引入了一系列创新功能,旨在增强用户的隐私和数据安全。本文将深入探讨iOS 14中的几大隐私保护新特性,包括App跟踪透明度、剪贴板访问通知和智能防追踪功能,分析这些功能如何提升用户隐私保护,并评估它们对开发者和用户体验的影响。 ####
|
1月前
|
存储 缓存 开发者
Python编程中的装饰器深度解析
本文将深入探讨Python语言的装饰器概念,通过实际代码示例展示如何创建和应用装饰器,并分析其背后的原理和作用。我们将从基础定义出发,逐步引导读者理解装饰器的高级用法,包括带参数的装饰器、多层装饰器以及装饰器与类方法的结合使用。文章旨在帮助初学者掌握这一强大工具,同时为有经验的开发者提供更深层次的理解和应用。
35 7
|
1月前
|
存储 安全 Java
Java多线程编程中的并发容器:深入解析与实战应用####
在本文中,我们将探讨Java多线程编程中的一个核心话题——并发容器。不同于传统单一线程环境下的数据结构,并发容器专为多线程场景设计,确保数据访问的线程安全性和高效性。我们将从基础概念出发,逐步深入到`java.util.concurrent`包下的核心并发容器实现,如`ConcurrentHashMap`、`CopyOnWriteArrayList`以及`BlockingQueue`等,通过实例代码演示其使用方法,并分析它们背后的设计原理与适用场景。无论你是Java并发编程的初学者还是希望深化理解的开发者,本文都将为你提供有价值的见解与实践指导。 --- ####
|
1月前
|
PHP 开发者
PHP 7新特性深度解析
【10月更文挑战第40天】随着PHP 7的发布,这个广泛使用的语言带来了许多令人兴奋的新特性和性能改进。本文将深入探讨PHP 7的主要变化,包括类型声明、错误处理机制、性能优化等方面,帮助开发者更好地理解和应用这些新特性。
34 4

推荐镜像

更多