每日前端夜话(0x02):ECMAScript 2016,2017和2018中所有新功能的示例(下)

Posted 前端先锋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日前端夜话(0x02):ECMAScript 2016,2017和2018中所有新功能的示例(下)相关的知识,希望对你有一定的参考价值。

原文:https://medium.freecodecamp.org/here-are-examples-of-everything-new-in-ecmascript-2016-2017-and-2018-d52fa3b5a70e
翻译:疯狂的技术宅

每日前端夜话,陪你聊前端。每天晚上准时推送

前文链接:

ECMAScript目前正在最终草案中,将于2018年6月或7月结束。下面介绍的所有功能都在第4阶段,并将成为ECMAScript 2018的一部分。

1.共享内存和Atomics

这是一个巨大的,非常先进的功能,是JS引擎的核心增强功能。

主要思想是为JavaScript提供某种多线程功能,以便JS开发者可以通过自己管理内存——而不是让JS引擎管理内存——来编写高性能的并发程序。

这是通过一种名为SharedArrayBuffer(https://developer.mozilla.org/en-US/docs/Web/javascript/Reference/Global_Objects/SharedArrayBuffer)的新型全局对象完成的,该对象实质上将数据存储在共享内存空间中。因此,这些数据可以在主JS线程和Web工作线程之间共享。

到目前为止,如果我们想在主JS线程和Web工作者之间共享数据,就必须复制数据并使用postMessage将其发送到另一个线程。以后不会再这样了!

只需使用SharedArrayBuffer,主线程和多个Web工作线程都可以立即访问数据。

但是在线程之间共享内存会导致竞争条件。为了帮助避免竞争条件,引入了“Atomics”全局对象(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics)。 Atomics提供了各种方法,使得线程在使用其数据时锁定共享内存。它还提供了安全地更新共享内存中数据的方法。

建议通过某个库使用此功能,但是现在没有基于此功能构建的库。
如果你有兴趣,我建议阅读:

  1. From Workers to Shared Memorylucasfcosta

    (http://lucasfcosta.com/2017/04/30/JavaScript-From-Workers-to-Shared-Memory.html

  2. A cartoon intro to SharedArrayBuffersLin Clark

    (https://hacks.mozilla.org/category/code-cartoons/a-cartoon-intro-to-sharedarraybuffers/)

  3. Shared memory and atomicsDr. Axel Rauschmayer

    (http://2ality.com/2017/01/shared-array-buffer.html)

2.删除了标记模板文字限制

首先,我们需要澄清“标记模板文字”是什么,以便我们更好地理解这个功能。

在ES2015 +中,有一个称为标记模板文字的功能,允许开发人员自定义字符串的插值方式。 例如,在标准方式中,字符串被插入如下…

每日前端夜话(0x02):ECMAScript 2016,2017和2018中所有新功能的示例(下)

在标记的文字中,你可以编写一个函数来接收字符串文字的硬编码部分,例如 ['Hello','!'] ,或者替换变量,例如 ['Raja'] ,作为参数进入自定义函数(例如 greet ),并从该自定义函数返回您想要的任何内容。

下面的示例演示自定义“标记”函数greet,根据当前时间返回例如“Good Morning!” “Good afternoon!”之类的字符串。

每日前端夜话(0x02):ECMAScript 2016,2017和2018中所有新功能的示例(下)
显示自定义字符串插值的标记功能示例

现在我们讨论了“Tagged”函数是什么,许多人想要在不同的领域中使用此功能,例如在终端中使用命令行或HTTP请求来拼接URIs等等。

⚠️标记字符串字符的问题
问题是在ES2015和ES2016规范不允许使用转义字符,如“u”(unicode),“x”(十六进制),除非它们看起来完全像u00A9u{2F804}xA9

因此,如果你有一个Tagged函数在内部使用其他领域的规则(如终端的规则),可能需要使用ubla123abla这样的字符,它看起来一点也不像u0049或u {@F804}的样子,最后你将会得到一个语法错误。

不过在ES2018中,只需要Tagged函数返回一个具有“cooked”属性(赋值为“undefined”)和“raw”属性( 你想要的任何内容)的对象即可。

1function myTagFunc(str
2     return { "cooked""undefined""raw": str.raw[0] }
3
4
5var str = myTagFunc `hi ubla123abla`//call myTagFunc
6str // { cooked: "undefined", raw: "hi \unicode" }

3.正则表达式的“dotall”标志

目前在正则表达式中,虽然点(“.”)应该与单个字符匹配,但它不能与 f等新行字符匹配。

例如:

1//Before
2/first.second/.test('first second'); //false

这个功能使点运算符可以匹配任何单个字符。 为了确保不会破坏任何内容,我们需要在创建正则表达式时使用s标志才能使其正常工作。

1//ECMAScript 2018
2/first.second/s.test('first second'); //true   Notice: /s 

以上是关于每日前端夜话(0x02):ECMAScript 2016,2017和2018中所有新功能的示例(下)的主要内容,如果未能解决你的问题,请参考以下文章

一文学懂 TypeScript 的类型 [每日前端夜话0x39]

我们应该为 JavaScript 重新命名吗?[每日前端夜话0xDA]

这才是GraphQL最详细的解释[每日前端夜话0x80]

值得关注的 Vue.js开源项目[每日前端夜话0xFF]

npm 和 yarn 你选哪个?[每日前端夜话0x100]

完全搞懂 Javascript 中的... [每日前端夜话0xE3]