ES10 功能完全指南

(给前端大全加星标,提升前端技能

编译:Ioodu

juejin.im/post/5c7c8e125188256365101c34


ES10仍然只是一个草案。但是除了 Object.fromEntries大多数功能已经在 Chrome中实现,所以你为什么不尽早开始探索它呢?当所有浏览器开始支持它时,你已经获得了领先优势,这只是时间问题。对于有兴趣探索ES10的人来说,这是一份非外星人指南。

ES10在新语言功能方面没有ES6那么重要,但它确实添加了一些有趣的东西(其中一些在目前版本的浏览器中还不起作用:02/20/2019)

640?wx_fmt=png

ES6中最受欢迎的功能莫过于箭头函数了,那么 ES10中呢?

BigInt - 任意精度整数

BigInt是第7种原始类型。

BigInt是一个任意精度的整数。这意味着变量现在可以代表2^53个数字。而且最大限度是9007199254740992。

const b = 1n; //追加n来创建一个BigInt

在过去的整数值大于9007199254740992不支持。如果超出,则该值将锁定为 MAX_SAFE_INTEGER + 1

 
 

typeof

typeof 10;
⇨ 'number'
typeof 10n;
⇨ 'bigint'

=== ==

10n === BigInt(10);
⇨ true
10n == 10;
⇨ true


* /

 
 

- +

-100n
⇨ -100n
+100n
⇨ Uncaught TypeError:
  Cannot convert a BigInt value to a number

当你读到这个 matchAll时,它可能会在 Chrome C73中正式实现 - 如果没有,它仍然值得一看。特别是如果你是一个正则表达式瘾君子。

string.prototype.matchAll()

如果你谷歌搜索"javascript string match all",第一条结果可能会是这样的How do I write a regular expression to “match all”? 。 排名靠前的结果会建议你使用 String.match匹配的时候在正则表达式或者 RegExp.exc或者 RegExp.text后加上 /g...

首先,我们来看下旧的规范是如何运行的。

String.match, match只返回字符串参数第一个符合匹配的。

 
 

匹配的结果是单个 'l'。(注意: match匹配的结果存储在 matches[0]而非在 matches),在字符串 'hello'中搜索匹配 'l'只有 'l'被返回来。使用 regexp参数也是得到一样的结果。

我们把字符 'l'更换为表达式 /l/:

let string = 'Hello'
let matches = string.match(/l/)
console.log(matches[0]) // 'l'


添加 /g

String.match使用正则表达式带上 /g标签会返回多个匹配。

 
 

Great...在低于 ES10的环境中我们得到了多个匹配结果,并且一直有效。

那么为什么要用全新的 matchAll方法呢?在我们更详细地回答这个问题之前,让我们来看看 capture group。如果不出意外,你可能会学到新的有关正则表达式的东西。

正则表达式捕获组

在正则表达式中捕获组只是在 ()括号中提取匹配。你可以从 /regex/.exec(string)和 string.match捕获组。

通常捕获组是在匹配规则中被创建的。输出对象上创建 groups属性如: (?<name>)。要创建一个新的组名,只需在括号内添加 (?<name>)属性,分组(模式)匹配将成为附加到 match对象的 groups.name

看一个实际的例子:

字符串标本匹配

640?wx_fmt=png

创建 match.groups.color & match.groups.bird匹配:

 
 

需要多次调用 regex.exec方法来遍历整个搜索结果。在每次迭代调用 .exec时,会显示下一个结果(它不会立即返回所有匹配项)。

控制台输出:

black*raven at 0 with 'black*raven lime*parrot white*seagull'
black
raven
lime*parrot at 11 with 'black*raven lime*parrot white*seagull'
lime
parrot
white*seagull at 23 with 'black*raven lime*parrot white*seagull'
white
seagull

这里有一个怪事:

如果你从这个正则表达式中删除 / g,你将永远在第一个结果上创建一个无限循环循环。这在过去是一个巨大的痛苦。想象一下从某个数据库接收正则表达式,你不确定它是否在最后有 / g。你必须先检查它,等等。

现在我们有足够的背景知识回答这个问题:

最好使用 .matchAll()

1、使用捕获组时更加优雅。捕获组知识带有提取模式()的正则表达式的一部分。

2、它返回一个迭代器而不是数组,迭代器本身很有用。

3、可以使用扩展运算符...迭代器转为数组

4、它避免使用带 /g标志的正则表达式...当从数据库或外部源检索未知的正则表达式并与古老的RegEx对象一起使用时非常有用。

5、使用 RegExp对象创建的正则表达式不能使用点( .)运算符链接。

6、**高级: RegEx**对象跟踪最后匹配位置的内部 .lastIndex属性,这可能对复杂案例有破坏性的事情。

.matchAll()如何工作

这是一简单个例子。

我们尝试匹配字符串 Hello的所有 e和 l。因为返回了iterator,所以我们用 for ... of处理它。

 
 

如上,你可以跳过 /g, .matchAll不需要它。结果:

 
 

使用 .matchAll()捕获组示例: .matchAll()具有上面列举的所有好处,它是一个迭代器,所以我们可以用它来循环,这就是整个句法差异。

 
 

注意去掉 /g标志,因为 .matchAll()已经隐含了它。

结果输出:

black*raven at 0 with 'black*raven lime*parrot white*seagull'
black
raven
lime*parrot at 11 with 'black*raven lime*parrot white*seagull'
lime
parrot
white*seagull at 23 with 'black*raven lime*parrot white*seagull'
white
seagull

也许在美学上它与循环实现时的原始 regex.exec非常相似。但如前所述,由于上述许多原因,这是更好的方法。并且删除 / g不会导致无限循环。

动态 import

现在可以将导入分配给一个变量:

 
 

Array.flat()

扁平化多维数组:

 
 

Array.flatMap()

 
 

变为:

 
 

再次扁平化数组:

 
 

Object.fromEntries()

将键值对列表转换为对象。

 
 

String.trimStart() & String.trimEnd()

 
 

格式良好的JSON.stringify()

此更新修复了字符 + D800到 + DFFF的处理,有时可以进入 JSON字符串。这可能是一个问题,因为 JSON.stringify可能会返回格式化为没有等效 UTF-8字符的值的这些数字。但 JSON格式需要 UTF-8编码。

JSON 对象可用于解析 JSON 格式(但也更多。) JavaScript JSON 对象也具有 stringify和 parse方法。

该解析方法适用于一个结构良好的 JSON字符串,如:

'{ “prop1” : 1, "prop2" : 2 }'; // A well-formed JSON format string

请注意,创建具有正确 JSON格式的字符串绝对需要使用围绕属性名称的双引号。缺少 ...或任何其他类型的引号将不会产生格式良好的 JSON

'{ “prop1” : 1, "meth" : () => {}}'; // Not JSON format string

JSON 字符串格式是不同的,从对象文本 ......它看起来几乎相同,但可以使用任何类型的周围属性名称的报价,还可以包括方法(JSON格式不允许的方法):

let object_literal = { property1meth:()=> {} };

无论如何,一切似乎都很好。第一个示例看起来合规。但它们也是简单的例子,大部分时间都可以毫无障碍地工作!

U + 2028和U + 2029字符

这是捕获。 ES10之前的 EcmaScript实际上并不完全支持 JSON格式。在 ES10之前的时代,不接受未转义的行分隔符 + 2028和段落分隔符 + 2029字符:

640?wx_fmt=png

U + 2029是行分隔符。640?wx_fmt=png

U + 2029是段落分隔符。有时它可能会潜入您的JSON格式字符串。

对于U + D800 - U + DFFF之间的所有字符也是如此

如果这些字符悄悄进入你的JSON格式的字符串(比如说来自数据库记录),你最终可能花费数小时试图弄清楚为什么程序的其余部分会产生解析错误。

所以,如果你传递的 eval一个字符串,像“ console.log(‘hello’)”这将执行 JavaScript语句(试图通过字符串实际代码转换。)这也类似于如何 JSON.parse将处理您的 JSON字符串。

稳定的Array.prototype.sort()

V8的先前实现对包含10个以上项的数组使用了不稳定的快速排序算法。

一个稳定的排序算法是当两个具有相等键的对象在排序输出中以与未排序输入中出现的顺序相同的顺序出现时。

但现在已经不是这样了。ES10提供稳定的阵列排序:

 
 

控制台输出(项目以相反的顺序出现):

640?wx_fmt=png

New Function.toString()

Funcitons是对象,每个对象都有个 .toString()方法因为它最初存在于 Object.prototype.toString()。所有的 objects(包括functions)都继承至基于原型的类继承。这意味着我们已经有了 function.toString()方法了。

但是ES10进一步尝试标准化所有对象和内置函数的字符串表示。以下新案例:

Classic example

 
 

控制台输出(字符串格式的函数体:)

 
 

以下是其它案例:

直接来自函数名

 
 

绑定上下文

 
 

内置可调用函数对象

 
 

动态生成的函数

 
 

动态生成的生成器 function*

 
 

prototype.toString

 
 

可选的Catch Binding

在过去, try / catch语句中的 catch子句需要一个变量。

try / catch语句帮助我们拦截在终端层面的错误:

这是一个复习:

 
 

但在某些情况下,所需的 error变量未被使用:

 
 

编写此代码的人尝试通过强制为 true退出 try子句。但是......事实并非如此(正如 Douglas Massolari.所说)。

 
 


在ES10中,Catch Error Binding是可选的

你现在可以跳过 error变量:

 
 

标准化的 globalThis 对象

ES10之前全局 this没有标准化。

生产代码中,你必须手动添加如下代码来标准化多个平台的全局对象。

 
 

但即使这样也并不总是奏效。所以 ES10添加了 globalThis对象,从现在开始应该在任何平台上访问全局作用域:

 
 

Symbol.description

description 是一个只读属性,返回 Symbol 对象的可选描述。

 
 

Hashbang 语法

shebang unix用户会熟悉 AKA

它指定一个解释器(什么将执行您的JavaScript文件?)

ES10标准化了这一点。我不会详细介绍这个,因为这在技术上并不是一个真正的语言功能。但它基本上统一了JavaScript在服务器端的执行方式。

$ ./index.js

代替:

 
 

在类Unix操作系统下。

ES10 Classes: private, static & public members

新的语法字符#(hash tag)现在直接在类主体作用域以及 constructor和类方法里被用来定义 variables, functions, getters和 setters

这是一个相当无意义的示例,仅关注新语法:

class Raven extends Bird {
    #state = { eggs: 10};
    // getter
    get #eggs() { 
        return state.eggs;
    }
    // setter
    set #eggs(value) {
        this.#state.eggs = value;
    }
    #lay() {
        this.#eggs++;
    }
    constructor() {
        super();
        this.#lay.bind(this);
    }
    #render() {
        /* paint UI */
    }
}

说实话,我认为它使语言更难阅读。

它仍然是我最喜欢的新功能,因为我喜欢 ++时代的 classes

640?wx_fmt=png

640?wx_fmt=png

总结与反馈

ES10是一套尚未有机会在生产环境中进行全面探索的新功能。如果您有任何更正,建议或任何其他反馈,请告诉我们。

我经常写一个教程,因为我想自己学习一些科目。这是其中一次,有其他人已经编译的资源的帮助:

感谢Sergey Podgornyy写了这篇ES10教程。 感谢 Selvaganesh写了这篇ES10教程。

 热 文 推 荐 

☞ 使用 webpack 各种插件提升你的开发效率

☞ 中高级前端大厂面试秘籍,寒冬中为您保驾护航,直通大厂(上)

☞ 我是如何在阿里巴巴面试中壮烈牺牲的?(内含面试题)

☞ vue-cli3 项目从搭建优化到docker部署

☞ 前端开发免费资源大汇总

640?wx_fmt=png

640?wx_fmt=png

喜欢就点击“好看”吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: ES10G76-网络产品高加速寿命试验(HALT)指南是针对网络产品的一项测试指南。网络产品在长时间运行过程中可能会遇到各种因素导致故障,而高加速寿命试验是为了测试产品在短时间内接受大量应力情况下的表现。 高加速寿命试验(HALT)是一种加速寿命测试方法,旨在验证网络产品在正常操作范围之外的极端条件下的运行能力。该试验旨在发现可能导致产品失效的弱点,并提供改进和优化的方向。 在ES10G76-网络产品高加速寿命试验指南中,可能会包括以下内容: 1. 试验目的和要求:明确测试的目的和要求,例如测试产品的可靠性和稳定性。 2. 设备和设施:列出进行测试所需的仪器设备和实验室设施。确保测试环境符合相关的标准。 3. 测试过程:详细描述测试的步骤和方法。这可能包括将产品暴露在高温、低温、高湿度、低湿度等极端环境下,并记录产品的响应和性能表现。 4. 数据分析和评估:对试验数据进行分析和评估,以了解产品在不同条件下的表现。这可能包括记录产品的故障模式和寿命预测。 5. 结果和结论:总结试验的结果和结论,评估产品是否符合要求,并提出改进建议。 ES10G76-网络产品高加速寿命试验指南是网络产品测试的一项重要指南,通过对产品的高强度测试,可以帮助制造商发现和解决产品的潜在问题,提高产品的可靠性和稳定性,满足用户的需求和期望。 ### 回答2: es10g76是一种网络产品高加速寿命试验(halt)指南。该指南旨在评估网络产品在长时间运行状态下的可靠性和耐久性。在网络产品开发过程中,halt试验是非常重要的一环,能够提前发现产品的潜在问题,以确保其在实际应用中的稳定性和可靠性。 es10g76指南以高加速寿命试验为基础,通过模拟长时间运行环境,对网络产品进行各种极端条件的测试。这些条件包括高温、低温、高湿度、低湿度、温度变化、机械振动等。通过这些试验,可以评估网络产品在不同环境下的性能和可靠性,帮助生产商购买者确定产品的使用寿命和可信度。 在halt试验中,还涉及到产生加速寿命失败事件的方式和方法。通过制造各种异常情况,如电源故障、高温过载、电磁干扰等,测试网络产品的抗击打能力和恢复能力。测试过程中监测网络产品的各种参数,如电压、电流、温度等,以评估其性能和稳定性。 通过halt试验指南,可以为网络产品的设计、制造和应用提供一些指导原则和技术规范。生产商可以根据其特定需求和实际情况,结合halt试验指南中的要求,进行相应的试验。这样可以更好地评估产品的可靠性和性能,提高产品的质量和竞争力。 综上所述,es10g76-网络产品高加速寿命试验(halt)指南是一个非常重要的工具,用于评估网络产品的可靠性和耐久性。通过halt试验,可以提前发现潜在问题,确保产品在实际应用中的稳定性和可靠性,为生产商和消费者提供有力的技术支持。 ### 回答3: ES10G76是网络产品高加速寿命试验(Halt)指南的标题,该指南的主要目的是为了评估网络产品在极端环境下的可靠性和稳定性。高加速寿命试验是一种通过模拟产品在使用过程中可能遇到的极端条件,来测试其工作范围和承受能力的方法。 根据该指南,网络产品在高加速寿命试验中需要经历一系列的测试环境和条件。这些条件可能包括高温、低温、高湿、低湿、电压波动、机械振动等。通过将产品置于这些环境中,并进行连续和周期性的测试,可以评估产品在极端条件下的工作稳定性和可靠性。 在高加速寿命试验中,需要记录和评估一系列测试指标。这些指标包括产品的工作温度范围、湿度范围、电压变化范围等。同时,还需要记录产品在测试过程中的故障次数、维修次数以及故障原因等。 通过高加速寿命试验,可以发现和改善网络产品在使用过程中可能出现的问题。这将有助于提高产品的可靠性和性能,为用户提供更好的使用体验。此外,高加速寿命试验还可以用于产品的质量认证和标准制定,确保产品符合相关的技术规范和标准要求。 总之,ES10G76网络产品高加速寿命试验指南是用于评估网络产品在极端环境下可靠性和稳定性的指南。通过这个指南进行高加速寿命试验,可以检测产品在极端条件下的工作范围和承受能力,并发现和改善可能出现的问题。这将有助于提高产品的性能和可靠性,为用户带来更好的体验。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值