开发者社区> 我是小助手> 正文

ES2018 新增特性清单

简介: 从es2016开始,tagged 模板字符串会对以\u、\u{}、\x开头或者\加数字开头的字符串进行转义。但是如果在模板字符串中出现以上述字符开头的非转义字符的话,会报语法错误。
+关注继续查看

Rest/Spread 属性

rest

将对象的剩余属性复制到一个新对象中。

let { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 };
x; // 1
y; // 2
z; // { a: 3, b: 4 }

spread

将对象的属性快速复制到另一个对象。

let n = { x, y, ...z };
n; // { x: 1, y: 2, a: 3, b: 4 }

异步iterator和异步iterables

与iterator不同,异步iterator的next()方法返回一个包含{ value, done }的promise。

const { value, done } = syncIterator.next();

asyncIterator.next().then(({ value, done }) => /* ... */);

可以看到syncIterator是一个异步遍历器。它可以通过异步generator生成。下面演示如何定义异步generator函数。

异步 generator 函数


async function* asyncGen() {
  let p1 = new Promise((resolve, reject) =>{
      setTimeout(()=>{
          resolve(1);
      }, 1000)
  });
  let p2 = new Promise((resolve, reject) =>{
      setTimeout(()=>{
          resolve(2);
      }, 1000)
  });
  yield await p1;
  yield await p2
}

for-await-of

es2018提供了新的遍历语法对异步 iterator 进行遍历。

for await (const val of asyncGen()) {
  console.log(val);
}

Promise.prototype.finally()

Promise.prototype.finally()不管promise的执行结果是成功还是失败,在promise执行完成后,会触发一个回调函数。常见的应用场景比如在ajax请求成功或失败后,隐藏loading动画。

fetch('https://demo.com/endpoint')
.then(res => {
    // ...
})
.catch(err => {
    // ...
})
.finally(() => {
    // do sth no matter success or failure
})

tagged 模板字符串与 转义序列

从es2016开始,tagged 模板字符串会对以\u、\u{}、\x开头或者\加数字开头的字符串进行转义。但是如果在模板字符串中出现以上述字符开头的非转义字符的话,会报语法错误。

es2018中取消了tagged 模板中对于转义字符的限制,正常解析的话可以正常获取转义字符的值,否则的话返回undefined。

function latex(str) { 
 return { "cooked": str[0], "raw": str.raw[0] }
} 

latex`\unicode`
// { cooked: undefined, raw: "\unicode"}

可以看到我们通过str[0]去获取转义字符的值并不会报错。通过str.raw[0]可以正常取得字符串"\unicode"。

正则相关的特性

s (dotAll)模式

我们知道元字符.无法匹配\r \n \u{2048} \u{2049}等换行符。

在 ES2018 中为正则表达式增加了一个新的标志 s 用来表示属性dotAll。以使 .可以匹配任意字符, 包括换行符。

const re = /foo.bar/s;
re.test('foo\nbar');
// → true
re.dotAll
// → true
re.flags
// → 's'

命名捕获组 named capture groups

正则表达式中可以通过数字索引来引用()语法捕获的部分匹配结果。如

let re = /(\d{4})-(\d{2})-(\d{2})/;
let result = re.exec('2015-01-02');
console.log(result[1],result[2],result[3]);
// 2015, 01, 02

es2018中提供了命名捕获组的功能。我们可以通过(?<name>...)语法给捕获组命名。

let re = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/u;
let result = re.exec('2015-01-02');
// result.groups.year === '2015';
// result.groups.month === '01';
// result.groups.day === '02';

或者以解构语法简化代码:

let {groups: {year, month, day}} = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/u.exec('2015-01-02');
console.log(`year: ${year}, month: ${month}, day: ${day}`);  // prints year: 2015, month: 01, day: 02

后行断言

es5中,正则只支持先行断言。例如:

正向先行断言/x(?=y)/表示字符x后面的位置必须是y。

负向先行断言/x(?!y)/表示x字符后面的位置不能等于y。

es2018中新增了后行断言的支持。例如:

/(?<=y)x/表示字符x前面的位置必须是y。

/(?<!y)x/表示字符x前面的位置不能是y。

let re = /(?<=java)script/;
consle.log(re.test('javascript'));
// true

Unicode property escapes

Unicode property escapes使得可以在js正则表达式中本地访问这些Unicode字符属性。 例如,模式\p {Script_Extensions = Greek}匹配希腊脚本中的任意符号。

const regexGreekSymbol = /\p{Script_Extensions=Greek}/u;
regexGreekSymbol.test('π');
// → true

可选的catch参数

es2018对语法进行了修改,catch在没使用参数的情况下省略括号。例如:

try {
  // try to use a web feature which may not be implemented
} catch (unused) {
  // fall back to a less desirable web feature with broader support
}

上述代码在新规范下可以写成:

try {
  // try to use a web feature which may not be implemented
} catch {
 // 省略catch后的函数括号
}

JSON 超集

我们知道es5中通过JSON.parse可以将json字符串转换成js的json对象。但有例外,那就是当json文本中存在未转义的换行符如\u2028,\u2029时,js中会报语法错误。

es2018中做了扩展,支持了所有的json文本,因此同样允许未转义的换行符的存在。

const LS = "
";
const PS = eval("'\u2029'");

上述代码片段在实现了es2018规范的浏览器中是不会出现语法错误的,反之则会报语法错误。自己可以试一下。



原文发布时间为:2018年06月27日

本文作者:antwang
本文来源:掘金 如需转载请联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
ES6 对象的扩展内容
ES6 对象的扩展内容
11 0
ES6入门之对象的新增方法
ES6入门之对象的新增方法
22 0
每日一题:ES6中对象新增了哪些扩展?
每日一题:ES6中对象新增了哪些扩展?
23 0
每日一题:ES6中函数新增了哪些扩展?
每日一题:ES6中函数新增了哪些扩展?
32 0
QLExpress功能清单
QLExpress从一开始就是从复杂的阿里电商业务系统出发,并且不断完善的脚本语言解析引擎框架,在不追求java语法的完整性的前提下(比如异常处理,foreach循环,lambda表达式,这些都是groovy是强项),定制了很多普遍存在的业务需求解决方案(比如变量解析,spring打通,函数封装,操作符定制,宏替换),同时在高性能、高并发、线程安全等方面也下足了功夫,久经考验。
16889 0
ES6(函数新增特性)
ES6(函数新增特性) 1.函数参数默认值 没有 y 时,默认就是world 有 y 时,输出值即可 (错误) (C有默认值,正确) 默认值后面不能再有没有默认值的变量  2.作用域 y 取其前面的 x ;而不是 x = test;     x 不在 y 的前面  3.test 参数 将输入参数(离散值)转化成数组  4.扩展运算符  将数组转化成离散值   5.箭头函数 arrow为函数名,第一个 = 后为参数, =>后为返回值,    第一个参数可为空。
874 0
ES6(对象(object)新增特性)
ES6(对象(object)新增特性) 1.简介表示法 o,k 为属性;这种为无方法的情况。 这种为有方法。 2.属性表达式 ES6中,【a】就是 b . 3.新增API     1.数组也是引用类型 2.Object.is 功能与 === 没有区别。
1099 0
C#各个版本中的新增特性详解
原文:C#各个版本中的新增特性详解 序言 自从2000年初期发布以来,c#编程语言不断的得到改进,使我们能够更加清晰的编写代码,也更加容易维护我们的代码,增强的功能已经从1.0搞到啦7.0甚至7.1,每一次改过都伴随着.NET Framework库的相应支持,也不断的带给我们期待与惊喜。
1474 0
+关注
我是小助手
云栖直播
文章
问答
文章排行榜
最热
最新
相关电子书
更多
《Pulsar 2.8.0 功能特性概述及规划》
立即下载
JS 语言在引擎级别的执行过程
立即下载
低代码开发师(初级)实战教程
立即下载