JavaScript进阶(二十六):ES各版本特性详解

文章目录

    • 一、ECMAScript简介
    • 二、ES6 (ES2015)
    • 三、ES7 (ES2016)
    • 四、ES8 (ES2017)
    • 五、ES9 (ES2018)
    • 六、ES10 (ES2019)
    • 七、ES11 (ES2020)
    • 八、ES12 (ES2021)
    • 九、拓展阅读

一、ECMAScript简介

ECMAScript是一种由Ecma国际(前身为欧洲计算机制造商协会,European Computer Manufacturers Association)通过ECMA-262标准化的脚本程序设计语言。这种语言在万维网上应用广泛,它往往被称为JavaScriptJScript,所以它可以理解为是JavaScript的一个标准,但实际上后两者是ECMA-262标准的实现和扩展。

二、ES6 (ES2015)

  1. Class

  2. 模块化语法(importexport

  3. 箭头函数 () => {…},是函数的缩写。

  4. 函数参数默认值

function fn(x,y='World') {console.log(x, y);
}
  1. 模板字面量
    之前实现中,长字符串的组合是通过 + 号来连接的。
    它的可读性很差,使用模板字符串,它更容易阅读。

  2. 解构赋值
    允许 JavaScript 轻松地从数组和对象中获取内容。

  3. 扩展运算符
    它是用三点(...)表示,Array是可以扩展的,如果是Object,会按照key-value进行扩展。

  4. 对象属性简写
    如果构成对象的字段名称与前面段落中的变量相同,则可以省略该值,看起来更流线型。

  5. Promise
    Promise 是一种异步(非同步)写法的解决方案,比原来的回调写法更加优雅。ES8(ES2017)发布了更完美的async,await,直接让异步写得像同步一样。缺点是当思路落到复杂的业务逻辑上时,有时会错过await,在运行时发生错误。

  6. let, const 替换 var

  • let:通用变量,可以被覆盖。
  • const:一旦声明,其内容不可修改。因为数组和对象都是指针,所以它们的内容可以增加或减少, 但不改变其指针。

早期,JavaScriptvar作用域是全局的。也就是说,var变量是在使用后声明的,执行的时候会自动提到顶层,后面会赋值。
更容易受到污染。

三、ES7 (ES2016)

  1. Array.prototype.includes()
    用于判断数组是否包含指定值,如果是,则返回true;否则,返回假。和之前indexOf的用法一样,可以认为是返回一个布尔值,语义上更加清晰。
  2. 幂运算符 console.log(2**10); // 1024

四、ES8 (ES2017)

  1. async, await
    异步函数是使用 async 关键字声明的函数,并且允许在其中使用 await 关键字。asyncawait 关键字使异步的、基于 Promise 的行为能够以更简洁的方式编写,避免了显式配置 Promise 链的需要。

  2. Object.values()
    返回对象自身属性的所有值,不包括继承的值。

  3. Object.entries()
    返回可枚举键,即传入对象本身的值。

  4. 字符串 padStart() & padEnd()
    你可以在字符串的开头或结尾添加其他内容,并将其填充到指定的长度。
    过去,这些功能通常是通过通用的辅助工具包(如 lodash)引入的,并将它们放在一起。

  5. 尾随逗号
    允许在函数参数列表末尾使用逗号。

  6. Object.getOwnPropertyDescriptors()
    获取你自己的描述符,一般的开发业务需求通常不会用到。

  7. 共享数组缓冲区
    SharedArrayBuffer 是一个固定长度的原始二进制数据缓冲区,类似于 ArrayBuffer
    可用于在共享内存上创建数据。与 ArrayBuffer 不同,SharedArrayBuffer 不能分离。

  8. Atomics object
    Atomics 对象,它提供了一组静态方法来对 SharedArrayBuffer 执行原子操作。原子的所有属性和函数都是静态的。

如果一个多线程同时在同一个位置读写数据,原子操作保证了正在操作的数据如预期的那样:即在上一个子操作结束后执行下一个,操作不中断。可以说是针对Node.Js中多线程Server的开发而加强的功能,在前端开发中使用的机会相当低。chrome 已经提供了支持。

五、ES9 (ES2018)

  1. 循环等待
    在异步函数中,有时需要在同步 for 循环中使用异步(非同步)函数。
async function process(array) {for (const i of array) {await doSomething(i);}
}async function process(array) {array.forEach(async i => {await doSomething(i);});
}

上面的代码不会像预期的那样输出期望的结果。

for循环本身还是同步的,会在循环中的异步函数完成之前执行整个for循环,然后将里面的异步函数逐一执行。

ES9 增加了异步迭代器,允许 awaitfor 循环一起使用,逐步执行异步操作。

async function process(array) {for await (const i of array) {doSomething(i);}
}
  1. promise.finally()
    无论是成功(.then())还是失败(.catch()),Promise 后面都会执行的部分。

  2. Rest, Spread
    在 ES2015 中,Rest 不定长度参数…,可以转换成数组传入。

  3. 正则表达式组
    RegExp 可以返回匹配的数据包

const regExpDate = /([0-9]{4})-([0-9]{2})-([0-9]{2})/;
const match      = regExpDate.exec('2020-06-25');
const year       = match[1]; // 2020
const month      = match[2]; // 06
const day        = match[3]; // 25
  1. 正则表达式 dotAll
    . 表示匹配除输入以外的任何符号,添加这些标志后,允许匹配输入。
/hello.world/.test('hello\nworld');  // false
/hello.world/s.test('hello\nworld'); // true

六、ES10 (ES2019)

  1. 更友好的 JSON.stringify
    如果输入是 Unicode 但超出范围,则 JSON.stringify 最初会返回格式错误的 Unicode 字符串。

现在是第 3 阶段的提案,使其成为有效的 Unicode 并以 UTF-8 呈现。

  1. Array.prototype.flat() & Array.prototype.flatMap()
    展平阵列

  2. String.prototype.trimStart() & String.prototype.trimEnd()
    trimStart() 方法从字符串的开头删除空格,trimLeft() 是此方法的别名。

  3. Object.fromEntries()
    Object.fromEntries() 方法将键值对列表转换为对象。

  4. String.prototype.matchAll
    matchAll() 方法返回将字符串与正则表达式匹配的所有结果的迭代器,包括捕获组。

  5. fixed catch 绑定
    在使用catch之前,不管有用与否,一定要传入一个eparameter来表示接收到的错误。
    如果现在不用,可以省略。

  6. BigInt(新数字类型)(重要)
    BigInt 值,有时也称为 BigInt,是一个 bigint 原语,通过将 n 附加到整数文字的末尾,或通过调用 BigInt() 函数(没有 new 运算符)并给它一个整数值或字符串来创建值。

  • ES5:String, Number, Boolean, Null, Undefined
  • ES6 新增:Symbol,到ES6就一共有6 种类型
  • ES10 新增:BigInt,就达到 7 种类型

七、ES11 (ES2020)

  1. Promise.allSettled()
    Promise.allSettled() 方法返回一个在所有给定的 Promise 都已实现或拒绝后实现的 Promise,并带有一组对象,每个对象都描述了每个 Promise 的结果。

它通常用于当有多个不依赖于彼此成功完成的异步任务,或者总是想知道每个 Promise 的结果时。

相比之下,Promise.all() 返回的 Promise 可能更合适,如果任务相互依赖/如果想立即拒绝其中任何一个拒绝。

  1. 可选链操作符?.

在开发中,很容易遇到先判断数据是否存在,判断是否写入。

const isUserExist = user && user.info;
if (isUserExist) { username = user.info.name; 
}

如果返回的数据为null或者用户对象下没有相应属性,则会抛出Uncaught TypeError: Cannot read property...

导致程序无法继续执行

使用 ?.,语法更简单

const username = user?.info?.name;

如果存在,获取name的值,如果不存在,赋值undefined

|| 一起使用,只需一行!

const username = user?.name || 'guest';
  1. Nullish 合并运算符 ??
    JavaScript中,遇到0、nullundefined时会自动转为false
    但有时0其实是一个正常的值,只能容错undefinednull,但是使用??,可以保持简洁。

  2. Dynamic-import
    从字面上看,应该很容易理解,就是在需要的时候加载相关的逻辑。

  3. GlobalThis
    全局 globalThis 属性包含全局 this 值,类似于全局对象。

八、ES12 (ES2021)

  1. Promise.any()
    Promise.any() 接受一个可迭代的 Promise 对象。它返回一个单一的 Promise,只要 iterable 中的任何一个 Promise 完成,就会返回一个 Promise,并带有已完成的 Promise 的值。

如果可迭代的实现中没有任何承诺(如果所有给定的承诺都被拒绝),则返回的承诺会被 AggregateError 拒绝,AggregateErrorError 的一个新子类,它将单个错误组合在一起。

  1. 逻辑赋值运算符
    在开发过程中,可以使用 ES2020 中提出的逻辑运算符 ||&& 和 `??(Nullish coalescing operator)来解决一些问题。

而 ES2021 会提出 ||= , &&= , ??= ,概念类似于 +=

let b = 2
b += 1 
// equal to b = b + 1
let a = null
a ||= 'some random text'  // a become to'some random text'
// equal a = a || 'some random text'
let c = 'some random texts'
c &&= null  // c become to null
// equal to c = c && null
let d = null
d ??= false  // d become to false
// equal to d = d ?? false
  1. WeakRef
    WeakRef 对象包含对对象的弱引用,该对象称为其目标或引用对象。对对象的弱引用是不会阻止对象被垃圾收集器回收的引用。相反,普通(或强)引用将对象保存在内存中,当一个对象不再有任何强引用时,JavaScript 引擎的垃圾收集器可能会销毁该对象并回收其内存。如果发生这种情况,将无法再从弱引用中获取对象。

九、拓展阅读

  • 《JavaScript进阶(十四):详解 ES6 中的 export 和 import》
  • 《JavaScript进阶(十三):JavaScript 空值合并运算符、可选链操作符、空值赋值运算符讲解》
  • 《JavaScript进阶(十二):JS 模块化编程规范-CommonJS、AMD、CMD、ES6》
  • 《JavaScript进阶(十八):ES6 Symbol 用法》
  • 《JavaScript进阶(二十):精解 ES6 Promise 用法》
  • 《JavaScript进阶(二十四):ES8 中 async 与 await 使用方法详解》
  • 《JavaScript进阶(二十五):Promise 详解》

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

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

相关文章

Sub-1G射频收发器soc芯片 UM2080F32 低功耗 32 位 IoTP

UM2080F32是基于 ARM Cortex M0 内核的超低功耗、高性能的、单片集成 (G)FSK/OOK 无线收发机的 32 位SOC 芯片。 UM2080F32 工作于200MHz~960MHz 范围内,支持灵活可设的数据包格式,支持自动应答和自动重发功能,支持跳频操作,支持 …

Hi3516DV500 SVP_NNN添加opencv库记录

默认没有带opencv库,但是实际项目中需要用到opencv库,因此添加一下此库; 1:编译opencv源码,这里具体可以参考 海思Hi3516移植opencv以及错误调试_海思hi3516摄像头开发-CSDN博客 2:在工程的根目录下新建…

计算机毕业设计 基于Web铁路订票管理系统 火车订票管理系统的设计与实现 Javaweb项目 Java实战项目 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…

【LeetCode第115场双周赛】100029. 和带限制的子多重集合的数目 | 前缀和背包 | 中等

题目内容 原题链接 给定一个长度为 n n n 的数组 n u m s nums nums 和一个区间左右端点 [ l , r ] [l,r] [l,r] 。 返回 n u m s nums nums 中子多重集合的和在闭区间 [ l , r ] [l, r] [l,r] 之间的 子多重集合的数目 。 子多重集合 指的是从数组中选出一些元素构成的 …

大数据学习(11)-hive on mapreduce详解

&&大数据学习&& 🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一下博>主哦&#x…

校招C#面试题整理—Unity客户端

前言 博客已经1年多没有更新了,这一年主要在实习并准备秋招和春招,目前已经上岸Unity客户端岗位,现将去年校招遇到的一些面试题的事后整理分享出来。答案是笔者自己整理的不一定保证准确,欢迎大家在评论区指出。 Unity客户端岗的…

相似性搜索:第 3 部分--混合倒排文件索引和产品量化

接续前文:相似性搜索:第 2 部分:产品量化 SImilarity 搜索是一个问题,给定一个查询的目标是在所有数据库文档中找到与其最相似的文档。 一、介绍 在数据科学中,相似性搜索经常出现在NLP领域,搜索引擎或推…

【MST】 CF1108 F

Problem - 1108F - Codeforces 题意 思路 先看样例 这里的 MST,是把边排序之后合并至权值为3 权值为3的两条边,选其中一条即可,但是不能两条都选,这样会形成环 这启示我们,我们要操作的是和Kruskal的最后一条边权值…

【MySql】6- 实践篇(四)

文章目录 1. 为何SQL语句逻辑相同,性能却差异巨大1.1 性能差异大的SQL语句问题1.1.1 案例一:条件字段函数操作1.1.2 案例二:隐式类型转换1.1.3 案例三:隐式字符编码转换 2. 为何只查询一行的SQL执行很慢2.1 场景一:查询长时间不返回2.1.1 等MDL锁2.1.2 等 flush2.1.…

【每日一题】只出现一次的数字 II

文章目录 Tag题目来源题目解读解题思路方法一:位运算 写在最后 Tag 【位运算】【数组】【2023-10-15】 题目来源 137. 只出现一次的数字 II 题目解读 找出数组中仅出现一次的数字,其余数字仅出现三次。要求线性时间复杂度求解。 解题思路 本题的朴素…

Java类加载过程

一、前言 我们都知道计算机的底层逻辑都是0和1的编码,当然除了现在所研究的量子计算除外。那么我们在计算机所做的一切操作,底层原理是不是都可以翻译到0和1呢。如果刨根问底的话,可以这么说,当然0和1的表示也属于逻辑门电路电的…

蓝牙资讯|2024年智能家居新趋势,蓝牙助力智能家居发展

2024年将迎来变革,智能家居趋势不仅会影响我们的生活空间,还会提高我们的生活质量,让我们有更多时间享受属于自己的时光。 2024年智能家居新趋势 趋势一:多功能科技 2024年预示着多功能技术的趋势,创新将成为焦点。混…

条例26~30(实现)

条例26 尽可能延后变量定义式出现的时间 尽可能的延后定义一个变量,因为只要你定义出来哪怕你没有使用,也得承受构造和析构成本。假如有异常抛出的情况,你定义类一个变量还没有使用的时候就抛出了异常。这个变量就直接调用了析构&#xff0…

Spring framework Day14:配置类的Lite模式和Full模式

前言 Lite模式和Full模式是指在软件或系统中的不同配置选项。一般来说,Lite模式是指较为简洁、轻量级的配置,而Full模式则是指更加完整、功能更丰富的配置。 Lite模式通常会去除一些不常用或占用资源较多的功能,以提高系统的运行效率和响应…

计算机算法分析与设计(9)---0-1背包和完全背包问题(含C++代码)

文章目录 一、0-1背包概述1.1 问题描述1.2 算法思想 二、0-1背包代码2.1 题目描述2.2 代码编写 三、完全背包概述四、完全背包代码4.1 题目描述4.1 代码编写4.2 代码优化 一、0-1背包概述 1.1 问题描述 1. 0-1背包问题:给定 n n n 种物品和一背包。物品 i i i 的…

【vue3】实现数据响应式(ref、shallowRef、trigger、reactive、shallowReactive、toRef、toRefs)

一、ref、shallowRef、trigger ref支持所有类型 可以粗略理解为 ref shallowRef triggerRef 1、通过ref获取dom元素 <p ref"_ref">这是ref获取dom元素</p>import {ref,shallowRef, triggerRef} from vueconst _ref ref()console.log(_ref.value?.i…

redis基本数据类型

一) 字符串(String) String是redis最基本的类型&#xff0c;value最大是512M&#xff0c;String类型是二进制安全的&#xff0c;可以包含任何数据&#xff0c;如jpg图片或者序列化的对象 1 使用场景 1) 缓存&#xff1a;redis作为缓存层&#xff0c;mysql做持久化层&#xff0…

AC修炼计划(AtCoder Regular Contest 166)

传送门&#xff1a;AtCoder Regular Contest 166 - AtCoder 一直修炼cf&#xff0c;觉得遇到了瓶颈了&#xff0c;所以想在atcode上寻求一些突破&#xff0c;今天本来想尝试vp AtCoder Regular Contest 166&#xff0c;但结局本不是很好&#xff0c;被卡了半天&#xff0c;止步…

力扣第538题 把二叉搜索树转换为累加树 c++

题目 538. 把二叉搜索树转换为累加树 中等 相关标签 树 深度优先搜索 二叉搜索树 二叉树 给出二叉 搜索 树的根节点&#xff0c;该树的节点值各不相同&#xff0c;请你将其转换为累加树&#xff08;Greater Sum Tree&#xff09;&#xff0c;使每个节点 node 的新值…

第56节——redux-toolkit中的createAction——了解

一、概念 createAction 是一个用于创建 Redux action creator 的函数&#xff0c;它可以让你更快地编写 Redux 相关的代码&#xff0c;并且更加易于阅读和维护。 二、简单示例 使用 createAction&#xff0c;你只需要传入一个字符串类型的 action type&#xff0c;然后它会返…