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

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

ES2016

Array.prototype.includes()

Array.prototype.includes 方法: 这个方法用于检查数组是否包含特定元素,如果包含则返回 true,否则返回 false

// 我有一个水果篮子
const fruitBasket = ['apple', 'banana', 'orange', 'grape'];
// 我要检查篮子里是否有橙子
const hasOrange = fruitBasket.includes('orange');
console.log(hasOrange); // 输出: true
// 我还想知道篮子里是否有葡萄
const hasGrape = fruitBasket.includes('grape');
console.log(hasGrape); // 输出: true
// 现在我要检查篮子里是否有西瓜
const hasWatermelon = fruitBasket.includes('watermelon');
console.log(hasWatermelon); // 输出: false

求幂运算

求幂运算符: 这是一个新的算术运算符,用于计算一个数的幂

// 我要计算 2 的 3 次幂
const result = 2 ** 3;
console.log(result); // 输出: 8

ES2017

Object.values/Object.entries

Object.valuesObject.entries 方法:

  • Object.values:把字典里的值都拿出来,就像拿出一个个水果。
  • Object.entries:把字典里的值和对应的名字都拿出来,就像知道每个水果的名字和样子。
const person = {
  name: 'Alice',
  age: 25,
  city: 'New York'
};
const values = Object.values(person); // 得到:['Alice', 25, 'New York']
const entries = Object.entries(person); // 得到:[['name', 'Alice'], ['age', 25], ['city', 'New York']]

字符串补全

字符串补全是一种操作,可以在一个字符串的末尾添加一些额外的字符,使得字符串的长度达到特定的目标长度。

console.log('a'.padStart(5, '1')); // 1111a
console.log('a'.padEnd(5, '2')); // a2222

async/await

async/await 是 JavaScript 中处理异步操作的一种方式,它使得在代码中处理异步任务更加直观和易读。

function simulateFetchingData() {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve('Data fetched');
    }, 1000);
  });
}
async function fetchData() {
  console.log('Fetching data...');
  const data = await simulateFetchingData();
  console.log(data); // 输出: 'Data fetched'
}
fetchData(); // 会在一秒后输出: 'Data fetched'

Object.getOwnPropertyDescriptors()

用于获取一个对象的所有属性的详细信息,包括属性的特性(例如可写、可枚举、可配置)以及属性的值。

const item = {
  name: 'Widget',
  color: 'Blue'
};
const descriptors = Object.getOwnPropertyDescriptors(item);
console.log(descriptors);

参数列表支持尾逗号

函数参数列表最后一个参数后面允许有一个逗号,这在以后添加更多参数时更方便。

function inviteFriends(friend1, friend2, friend3,) {
  console.log("Inviting:", friend1, friend2, friend3);
}
inviteFriends('Alice', 'Bob', 'Charlie',); // 输出: Inviting: Alice Bob Charlie

ES2018

for-await-of 异步迭代

异步迭代在 Node.js 中用的会多些,使用 for-await-of 遍历异步数据。例如使用 MongoDB 查询数据返回值默认为一个游标对象,避免了一次性把数据读入应用内存


想象你有一组需要分步完成的任务,比如读取多个文件,这些任务都是异步的。for-await-of 就像是一个一个完成这些任务,等一个任务完成后再进行下一个。

async function fetchUserData(userId) {
  // 模拟异步操作,比如从服务器获取用户数据
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve(`User data for ID ${userId}`);
    }, 1000);
  });
}
const userIds = [1, 2, 3];
(async () => {
  for await (const userData of userIds.map(fetchUserData)) {
    console.log(userData);
  }
})();

Promise.finally

Promise.finally 是在 Promise 结束(不管是成功还是失败)后,无论如何都会执行的代码块。

const fetchData = new Promise((resolve, reject) => {
  // 模拟异步操作
  setTimeout(() => {
    resolve('Data fetched');
  }, 1000);
});
fetchData
  .then(data => console.log(data))
  .catch(error => console.error(error))
  .finally(() => console.log('Promise finished'));

新的正则表达式功能

  • 正则命名组捕获
  • 正则表达式 Unicode 转义
  • 正则表达式dotAll模式
  • 正则 Lookbehind 断言

Rest/Spread 属性

这些属性让你可以更方便地处理函数参数和对象数组的拷贝。

想象你要组织一场聚会,需要把朋友们的名字一个一个列出来。Rest 属性就像是把这些名字都捡起来放进一个列表,而 Spread 属性就像是把这个列表里的名字一个一个散落出来。

// Rest 属性
function inviteFriends(host, ...guests) {
  console.log(`${host}邀请了${guests.join(', ')}参加聚会`);
}
inviteFriends('Alice', 'Bob', 'Charlie', 'David');
// Spread 属性
const oldFriends = ['John', 'Jane'];
const newFriends = ['Mike', 'Emily'];
const allFriends = [...oldFriends, ...newFriends];
console.log(allFriends); // 输出: ['John', 'Jane', 'Mike', 'Emily']

解除模版字符串限制

解析器会去查找有效的转义序列,例如 Unicode 字符以 "\u" 开头,例如 \u00A9,以下 "\unicode" 是一个非法的 Unicode 字符,在之前就会得到一个 SyntaxError: malformed Unicode character escape sequence 错误。ES2018 中解除了这个限制,当遇到不合法的字符时也会正常执行,得到的是一个 undefined,通过 raw 属性还是可以取到原始字符串。

function latex(strings, ...exps) {
  console.log(strings); // [ undefined ]
  console.log(strings.raw);  // [ 'latex \unicode' ]
 }
 latex`latex \unicode`;

ES2019

可选的 catch 参数

允许在 catch 块中省略异常参数,使得在不需要异常信息时代码更简洁。

try {
  // 一些可能会发生问题的代码
} catch {
  // 不需要异常参数
  console.log('出错了');
}

Symbol.prototype.description

这是一个新的方法,用于返回 Symbol 的可读描述,方便开发者理解 Symbol 的用途。


想象你有很多特殊的印章,每个印章代表不同的事情。description 就像是告诉你每个印章代表的是什么,让你能更好地理解这些印章。

const mySymbol = Symbol('这是一个特殊的标记');
console.log(mySymbol.description); // 输出: '这是一个特殊的标记'

函数的 toString() 方法

一个函数对象的方法,用于将函数的源代码转化成字符串。

function sayHello() {
  console.log('Hello!');
}
const functionString = sayHello.toString();
console.log(functionString); // 输出函数的源代码字符串

Object.fromEntries()

一个用于将键值对列表转换成对象的方法。

想象你有一些标签和对应的价值,现在你想把它们整理成一个清单。Object.fromEntries() 就像是帮你把这些标签和价值整理成一个清单。

const entries = [
  ['name', 'Alice'],
  ['age', 30]
];
const person = Object.fromEntries(entries);
console.log(person); // 输出: { name: 'Alice', age: 30 }

消除前后空格

一种字符串处理方法,用于去除字符串开头和结尾的空格。

const messyText = '   这里有很多空格   ';
const cleanText = messyText.trim();
console.log(cleanText); // 输出: '这里有很多空格'

数组 flat()、flatMap()

数组的两个方法,用于将多维数组拉平为一维数组,以及在拉平的同时对数组元素进行操作。Infinity是flat对数组深度展开,flatMap则只能展开一层。


想象你有一些叠在一起的盒子,里面还有更小的盒子。flat() 就像是把所有的盒子都打开,把里面的东西拿出来放在一起。而 flatMap() 就像是在拿出东西的同时,还可以对它们做些处理。

const nestedArray = [1, [2, [3, [4]]]];
const flattenedArray = nestedArray.flat();
console.log(flattenedArray); // 输出: [1, 2, [3, [4]]]
const flattened = nestedArray.flat(Infinity);
console.log(flattenedArray); // 输出: [1, 2, 3, 4]
const doubledArray = nestedArray.flatMap(value => value * 2);
console.log(doubledArray); // 输出: [2, 4, 6, [4]]

JSON 超集

ES2019 之前 JSON 字符串中不支持 \u2028(行分隔符)、\u2029(段落分隔符) 字符,否则 JSON.parse() 会报错,现在给予了支持。

const json = '"\u2028"';
JSON.parse(json);

JSON.stringify() 加强格式转化

防止 JSON.stringify 返回格式错误的 Unicode 字符串

相关文章
|
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

推荐镜像

更多