只知道ECMAScript 2015(ES6),一篇汇总ECMAScript 2015~ECMAScript 2023新特性

前言

我们常说的ES6也就是ECMAScript 2015是在2015年6月发布的。这个版本引入了许多重要的语言特性和改进,对 JavaScript 进行了深刻的扩展和升级,ES6 是 JavaScript 语言的一个里程碑。所以有时也被称为ES6。这是由于规范的发布年份与实际版本号之间的不匹配。然而,标准化组织决定更改命名方式,以便更好地反映年份,从而引入了“ECMAScript [年份]”的命名习惯。

从2015年的ECMAScript 2015(ES6)到现在的ECMAScript 2023。在这几年的发展中,我们见证了JavaScript的成为web开发的主导语言。但是人们在谈论JS时还是习惯性说ES6,然而举例2015已经过去了8年,是不是该更新一下知识库啦。

这篇文章我们介绍一下JavaScript从ES6到ES2023的重要变化。

ECMAScript 2015

这里只介绍一些主要的特性,

  1. let 和 const 声明: 引入了块级作用域的变量声明方式。let用于声明变量,而const用于声明常量。

  2. 箭头函数: 提供了更简洁的函数声明语法,尤其适用于匿名函数。

    // 传统函数
    function add(a, b) {return a + b;
    }// 箭头函数
    const add = (a, b) => a + b;
    
  3. 模板字符串: 允许在字符串中插入表达式,更易读且更灵活。

    const name = 'World';
    const greeting = `Hello, ${name}!`;
    
  4. 默认参数值: 允许在函数声明中为参数设置默认值。

    function greet(name = 'World') {console.log(`Hello, ${name}!`);
    }
    
  5. 解构赋值: 允许从数组或对象中提取值并赋给变量。

    // 数组解构
    const [a, b] = [1, 2];// 对象解构
    const { x, y } = { x: 1, y: 2 };
    
  6. 类和继承: 引入了更接近传统面向对象编程的类和继承语法。

    class Animal {constructor(name) {this.name = name;}speak() {console.log(`${this.name} makes a sound.`);}
    }class Dog extends Animal {speak() {console.log(`${this.name} barks.`);}
    }
    
  7. 模块化: 引入了模块系统,允许将代码分割为可维护的模块。

    // 导出
    export const myVar = 42;// 导入
    import { myVar } from './myModule';
    
  8. Promise: 提供了更强大的异步编程机制,以解决回调地狱问题。

    const myPromise = new Promise((resolve, reject) => {// 异步操作if (/* 操作成功 */) {resolve('Success!');} else {reject('Failure!');}
    });myPromise.then(result => console.log(result)).catch(error => console.error(error));
    
  9. for…of 和 for…in: 用于迭代对象和数组中的元素。

  10. Set和 Mapz:
    Set 是一种用于存储唯一值的集合。它不允许重复的元素,并提供了一系列方法来操作这些值。

const uniqueNumbers = new Set([1, 2, 3, 1, 2]);uniqueNumbers.add(4);
console.log(uniqueNumbers); // Set { 1, 2, 3, 4 }console.log(uniqueNumbers.has(2)); // true

Map 是一种键值对的集合,其中的键和值可以是任意数据类型。它提供了一种更灵活的方式来存储和检索数据,相较于对象,Map 在处理键值对的场景中更为直观和高效。

const userMap = new Map();userMap.set('name', 'John');
userMap.set('age', 30);console.log(userMap.get('name')); // 'John'
console.log(userMap.has('gender')); // false

ECMAScript 2016

ECMAScript 2016本质上是一个较小的更新,其中包括了一些相对较小的语法和功能改进。

  1. 指数操作符(Exponentiation Operator): 引入了指数操作符 **,用于计算一个数字的幂。

    let result = 2 ** 3; // 8
    
  2. Array.prototype.includes(): 在数组原型上添加了 includes 方法,用于检查数组是否包含特定元素。

    const array = [1, 2, 3];
    console.log(array.includes(2)); // true
    console.log(array.includes(4)); // false
    

ECMAScript 2017

ECMAScript 2017(也称为ES8)是在2017年发布的 JavaScript 语言的一个版本,相对于 ECMAScript 2016 来说,引入了一些新的功能和改进。以下是其中一些主要的变化:

  1. 异步函数(Async/Await)的改进: ES2017 对异步函数进行了一些改进,使其更加灵活和强大。异步函数是使用 async 关键字声明的函数,而 await 关键字可以在异步函数内部等待一个 Promise 解决。

    async function fetchData() {let response = await fetch('https://api.example.com/data');let data = await response.json();return data;
    }
    
  2. Object.values() 和 Object.entries(): 引入了 Object.values()Object.entries() 方法,分别用于获取对象的值数组和键值对数组。

    const obj = { a: 1, b: 2, c: 3 };console.log(Object.values(obj)); // [1, 2, 3]
    console.log(Object.entries(obj)); // [['a', 1], ['b', 2], ['c', 3]]
    
  3. 字符串填充方法(String Padding): 引入了字符串填充方法 String.prototype.padStart()String.prototype.padEnd(),用于在字符串前或后填充指定的字符。

    let str = 'hello';
    console.log(str.padStart(8, '*')); // '***hello'
    console.log(str.padEnd(8, '*')); // 'hello***'
    
  4. 共享内存与原子操作(Shared Memory and Atomics): 引入了 SharedArrayBuffer 和 Atomics 对象,用于更好地支持多线程和并行编程。

    // 创建共享内存
    const buffer = new SharedArrayBuffer(16);// 在共享内存上进行原子操作
    Atomics.add(new Int32Array(buffer), 0, 5);
    

ECMAScript 2019

也不是每一年都有那种很重要的改变,这里ECMAScript 2018 并入了 ECMAScript 2019

  1. Array.prototype.flat() 和 Array.prototype.flatMap(): 引入了 flatflatMap 方法,用于扁平化嵌套的数组结构。

    const nestedArray = [1, [2, [3, 4]]];
    const flatArray = nestedArray.flat(); // [1, 2, [3, 4]]
    

    flatMap 可以同时扁平化和映射数组。

  2. Object.fromEntries(): 提供了从键值对数组创建对象的方法。

    const entries = [['a', 1], ['b', 2], ['c', 3]];
    const obj = Object.fromEntries(entries); // {a: 1, b: 2, c: 3}
    
  3. String.prototype.trimStart() 和 String.prototype.trimEnd(): 引入了字符串的两个新方法,用于删除字符串开头和结尾的空格。

    const str = '   Hello   ';
    console.log(str.trimStart()); // 'Hello   '
    console.log(str.trimEnd()); // '   Hello'
    
  4. Symbol.prototype.description: 允许通过 Symbol.prototype.description 获取 Symbol 的描述信息。

    const mySymbol = Symbol('My Symbol');
    console.log(mySymbol.description); // 'My Symbol'
    
  5. Function.prototype.toString() 的改进: Function.prototype.toString() 方法现在返回精确的源代码表示,包括空格和注释。

    function example() {// This is a commentreturn 'Hello';
    }console.log(example.toString());
    // 函数源代码中包含注释和缩进
    

ECMAScript 2020

ECMAScript 2020(也称为ES11)引入了一些新的功能和改进。以下是其中一些主要的变化:

  1. 可选链操作符(Optional Chaining): 引入了可选链操作符(?.),用于简化访问可能不存在的属性或方法的代码。

    const user = {address: {street: '123 Main St'}
    };// 传统方式
    const street = user && user.address && user.address.street;// 使用可选链操作符
    const street = user?.address?.street;
    
  2. 空值合并操作符(Nullish Coalescing Operator): 引入了空值合并操作符(??),用于提供默认值,但仅在变量为 nullundefined 时。

    const defaultValue = 'Default';
    const userValue = null;// 传统方式
    const result = userValue !== null && userValue !== undefined ? userValue : defaultValue;// 使用空值合并操作符
    const result = userValue ?? defaultValue;
    
  3. 全局对象 globalThis: 引入了 globalThis,它提供了一种标准的方式来获取全局对象,无论代码在哪里执行(浏览器、Node.js、Web Workers等)。

    console.log(globalThis === window); // 在浏览器中为 true
    console.log(globalThis === global); // 在 Node.js 中为 true
    
  4. Promise.allSettled(): 引入了 Promise.allSettled() 方法,它接收一组 Promise,无论这些 Promise 是成功还是失败,都会等待它们全部 settled(已完成,不论是 resolved 还是 rejected)。

    const promises = [Promise.resolve('Success'), Promise.reject('Error')];Promise.allSettled(promises).then(results => console.log(results));
    
  5. 动态导入: 可以将js文件动态导入模块中。

  6. BigInt: js代码可以使用更大的整数。

  7. matchAll: 是一个用于 String 的新的方法,和正则相关。这个方法将返回一个迭代器,该迭代器一个接一个地返回所有匹配的组。

ECMAScript 2021

  1. String.prototype.replaceAll: 新增了字符串方法,可以全局替换字符串中的匹配项。
const originalString = 'apple banana apple orange';// 使用 replaceAll 替换所有的 'apple' 为 'grape'
const newString = originalString.replaceAll('apple', 'grape');console.log(newString);
// 输出: 'grape banana grape orange'
  1. 逻辑赋值运算符: 引入了逻辑赋值运算符,如&&=、||=和??=,用于对变量进行逻辑运算和赋值的组合操作。
let x = 1;// 逻辑与赋值
x &&= 2;  // x = x && 2;let y = 0;// 逻辑或赋值
y ||= 3;  // y = y || 3;let z = null;// 空值合并赋值
z ??= 4;  // z = z !== null && z !== undefined ? z : 4;
  1. 数字分隔符: 允许在数字中使用下划线作为分隔符,以提高数字的可读性。
const billion = 1_000_000_000;
const binary = 0b1010_0010_0011;
const decimal = 1_000_000.123_456;
  1. Promise.any: 新增了Promise的静态方法,接受一个Promise可迭代对象,返回第一个解决的Promise的值。
const promise1 = new Promise((resolve, reject) => setTimeout(resolve, 1000, 'one'));
const promise2 = new Promise((resolve, reject) => setTimeout(reject, 500, 'two'));
const promise3 = new Promise((resolve, reject) => setTimeout(resolve, 800, 'three'));Promise.any([promise1, promise2, promise3]).then(result => console.log(result)).catch(error => console.error(error));
  1. WeakRef: 引入了WeakRef和FinalizationRegistry API,用于处理弱引用和对象的最终化
let obj = { data: 'some data' };
let weakRef = new WeakRef(obj);console.log(weakRef.deref()); // { data: 'some data' }obj = null; // 弱引用不会阻止对象被垃圾回收console.log(weakRef.deref()); // undefined

ECMAScript 2022

顶层 await

在 ECMAScript 2022 中引入了顶层 await,它允许在模块的顶层直接使用 await 关键字,而不需要在异步函数内部包裹。

// 在模块的顶层直接使用 await
const result = await fetchData();console.log(result);

ECMAScript 2023

今年6月份发布了ECMAScript 2023,这将是目前最新版本的规范。

  1. findLast() 、findLastIndex(): 在 JS中,可以通过 find() 和 findIndex() 从前往后查找数组中的值。
    这两个方法支持从后往前查找,用法和find()、findIndex()一样。
const array = [{v: 1}, {v: 2}, {v: 3}, {v: 4}, {v: 5}];array.findLast(elem => elem.v > 3); // {v: 5}
array.findLastIndex(elem => elem.v > 3); // 4
array.findLastIndex(elem => elem.v > 5); // undefined

2.Hashbang 语法:
Hashbang(也称为 shebang)是一种在脚本文件的开头使用 #! 注释的语法,通常用于指定脚本文件的解释器。

#!/usr/bin/env node
  1. toReversed()、toSorted()、toSpliced()、with()
    之前js支持的reverse、sort、splice都是修改原数组的,以前使用这些方法想又不改变原数组,可能是这样:
const originalArray = [3, 1, 4, 1, 5, 9];const reversedArray = originalArray.slice().reverse();
const sortedArray = originalArray.slice().sort();
const splicedArray = originalArray.slice(1, 4);
const arrayWithElement = [...originalArray, 7];console.log(reversedArray); // 输出 [9, 5, 1, 4, 1, 3]
console.log(sortedArray);   // 输出 [1, 1, 3, 4, 5, 9]
console.log(splicedArray);  // 输出 [1, 4, 1]
console.log(arrayWithElement); // 输出 [3, 1, 4, 1, 5, 9, 7]

然而有以下这些方法返回新的数组,不改变原数组。是不是就简便多了。

  • toReversed():返回数组的逆序副本。
  • toSorted():返回数组的排序副本。
  • toSpliced():返回对数组进行切片后的副本。
  • with():可能是返回包含特定元素的副本。

with():该方法会以非破坏性的方式替换给定 index 处的数组元素,即 arr[index]=value 的非破坏性版本。

const arr = ['a', 'b', 'c'];
const arr1 = arr.with(2, 'd');
console.log(arr1); // ['a','b','d']
console.log(arr); // ['a', 'b', 'c']

今天就介绍这些吧,本文介绍并非全部新特性。
注意使用这些方法时看一下浏览器各个版本兼不兼容哦!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/162498.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenAI“宫斗”新进展!Sam Altman将重返OpenAI担任首席执行官 董事会成员改动

在经过激烈的五天讨论和辩论之后,高调人工智能初创公司OpenAI宣布,其联合创始人之一Sam Altman将回归担任首席执行官。这一决定是对上周Altman突然被解雇的回应,该决定引起了极大的关注和讨论。 OpenAI表示,他们已经达成了与Altm…

德迅云安全-德迅卫士:保障您的主机安全

主机安全是指保证主机在数据存储和处理的保密性、完整性、可用性,包括硬件、固件、系统软件的自身安全,以及一系列附加的安全技术和安全管理措施。 为什么要主机安全? 服务器一旦被黑客入侵,个人和企业面临以下安全风险&#xff…

张弛声音变现课,如何为偶像剧配音?

在为偶像剧进行配音工作时,配音员应当捕捉剧中角色的年轻活力、浪漫的爱情故事以及轻快的生活节奏。偶像剧主要讲述的是青春的爱恋、友谊和梦想追求,因此配音需要传递出剧中的真诚和活泼。为偶像剧配音可以考虑以下几点建议: 鲜明活泼的声音 …

如何判断交流回馈老化测试负载是否合格?

交流回馈老化测试负载是用于模拟实际工作环境中设备运行状态的测试工具,主要用于检测设备的耐久性和稳定性。 负载性能:需要检查负载的性能是否符合设计要求,这包括负载的功率、电流、电压等参数是否在规定的范围内,以及负载的工作…

【AI】行业消息精选和分析(11月23日)

今日动态 1、Sam Altman 重掌 CEO,OpenAI 权力斗争正式「落幕」 2、重磅好消息:语音 ChatGPT 现已向全用户开放 3、NVIDIA 与基因泰克合作,利用生成式 AI 加速药物发现 4、 英伟达Q3营收同比增长206%至181亿美元 黄仁勋:生成式AI时…

Zoho Bigin和标准版CRM有什么区别?

Zoho Bigin是Zoho公司推出的一款针对小微企业设计的CRM系统,它与Zoho CRM一脉相承,但更加轻量级,快速帮助小微企业实现数字化销售。下面来说说,Zoho Bigin是什么?它适合哪些企业? 什么是Zoho Bigin&#x…

【c语言】重温一下动态内存,int数组过大会造成栈错误

项目场景: 项目场景:互助群同学在刷题的过程中,遇到的一个题目,需要申请一个很大数组,于是这个同学就写了int[1000000],其实这样写也没有错,可是运行后却显示栈错误。于是就找到我来请教,我想就…

从零开始的c语言日记day36——指针进阶

一、什么是指针: 指针的概念:1.指针就是个变量,用来存放地址,地址唯一标识一块内存空间。 ⒉指针的大小是固定的4/8个字节(32位平台/64位平台)。 指针是有类型,指针的类型决定了指针的-整数的步长,指针解引用操作的时候的权限。…

嵌入式面经-python相关问题

1、c\cpp\python 区别,各自优缺点? 2、python是怎么处理 深拷贝和浅拷贝的? 3、python的多线程 多进程 4、用过python哪些库

玻璃加工ERP包含些模块?玻璃加工ERP好用吗

玻璃制品的类型多、规格不一、营销策略灵活、销售渠道广泛、生产关联业务环节。在当今这个市场竞争日益激烈的时代,如何有效整合各个业务环节,提升多部门协作效率,随时进行数据分析等,是每个玻璃加工企业面临的管理难题。 在数字…

【C语法学习】27 - 字符串转换为数字

文章目录 1 atoi()函数1.1 函数原型1.2 参数1.3 返回值1.4 转换机制1.5 示例1.5.1 示例1 1 atoi()函数 1.1 函数原型 atoi():将str指向的字符串转换为整数,函数原型如下: int atoi(const char *str);1.2 参数 atoi()函数只有一个参数str&…

docker部署paddleocr

内容仅供参考学习 欢迎朋友们V一起交流: zcxl7_7 环境 1. CentOS7  2. docker  3. PaddleOCR2.5.2 1.准备 1. 首先准备好需要打包的项目 2. 在该项目中创建Dockerfile文件 touch Dockerfile2. 编写Dockerfile # 从Python 3.8的官方镜像中创建(pyt…

建立简单的客户端-服务端通信系统

本文介绍如何使用C编写一个基本的客户端-服务端通信系统。通过这个例子&#xff0c;你将学到如何建立TCP连接、发送和接收消息&#xff0c;以及如何处理多个客户端连接。 客户端代码&#xff1a; #include <stdio.h> // 标准输入输出库&#xff0c;提供基本的输入…

matlab使用scatter函数画图时报错“数组索引必须为正整数或逻辑值”解决办法

一、背景 在使用matlab的scatter函数画图时报错“数组索引必须为正整数或逻辑值”。 scatter函数说明&#xff1a;scatter(x,y) 在向量 x 和 y 指定的位置创建一个包含圆形标记的散点图。 二、解决办法 如果使用scatter函数时报上述错误&#xff0c;尝试将连续函数先转换为函…

ubuntu编译sqlite3并使用

SQLite3是一种轻量级的关系型数据库管理系统&#xff0c;它是在C语言基础上实现的。SQLite3具有许多优点&#xff0c;例如&#xff1a; 1.灵活&#xff1a;它可以在多种操作系统上运行&#xff0c;并且可以将多个数据库文件合并成一个文件。 2.易于使用&#xff1a;SQLite3使用…

基于爬行动物算法优化概率神经网络PNN的分类预测 - 附代码

基于爬行动物算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于爬行动物算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于爬行动物优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

八股文面试day6

什么是代理&#xff1f;为什么要用动态代理&#xff1f; 代理模式大概意思是&#xff1a;为其他对象提供一个代理项或者是占位符&#xff0c;以控制对这个对象的访问 代理模式核心思想&#xff1a;创建一个代理对象&#xff0c;在客户端和目标对象之间的一个中介&#xff0c;…

35的程序员被辞了可以自己接外包啊?为什么都那么悲观呢?

35的年纪&#xff0c;上有老下有小&#xff0c;即将步入中年危机&#xff0c;在这个节骨眼上被辞&#xff0c;能不悲观吗&#xff1f; 在这个年纪人们往往追求的是稳定的工作和生活&#xff0c;而进入一个自己不熟悉的行业并不是一个好的选择。 况且&#xff0c;你认为的外包…

诊断0x27服务解密文件DLL制作与使用

DLL文件在CANoe的使用方法 DLL文件在诊断里面可以用在0x27秘钥服务里面&#xff0c;对解密有帮助&#xff0c;在下图位置加载。 DLL文件制作 vector公司本来就给了我们一个demo&#xff0c;先拷贝一份下来&#xff0c;别把原来的文件给改坏了。我这个是CANoe12&#xff0c;de…

Visio给立方体的每条边填充不同的颜色,超好用的visio小技巧~

Visio给立方体的每条边填充不同的颜色&#xff0c;超好用的visio小技巧~ 如何实现立方体的填充颜色从左边的纯色到右边的多色呢&#xff1f;一起学起来吧~ 在visio中绘制一个普通的立方体&#xff1b; 用一个大的矩形盖住刚才绘制的立方体&#xff1b; 全选之后找到 开发工具-&…