JavaScript ES2019中的8个新特性详解


Posted in Javascript onFebruary 20, 2019

前言

JavaScript 不断改进和添加更多功能。TC39 已经完成并批准了 ES2019 的这 8 个功能,它有 4 个阶段,这些阶段是:

  • Stage 0: Strawman
  • Stage 1: Proposals
  • Stage 2: Drafts
  • Stage 3: Candidates
  • Stage 4: Finished/Approved

以下链接可以查看Stage 0,Stage 1 ? 3 和Final Stage

可选的 Catch 绑定

能够在不使用 catch 绑定的地方选择性地删除它

try {
 // trying to use a new ES2019 feature
 // which may not be implemented in other browsers
} catch (unused) {
 // revert back to old way
}

现在可以删除未使用的绑定

try {
 ...
} catch {
 ...
}

JSON 超集

此提议的动机是 JSON 字符串可以包含未转义的 U + 2028 LINE SEPARATOR 和 U + 2029 PARAGRAPH SEPARATOR 字符,而 ECMAScript 字符串则不能。在 ES2019 之前,它会产生错误SyntaxError: Invalid or unexpected token

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

符号说明

在 ES2015 中引入符号,具有非常独特的功能。在 ES2019 中,它现在可以提供给定的描述。其目的是避免间接获得所提供的描述Symbol.prototype.toString

const mySymbol = Symbol("myDescription");

console.log(mySymbol); // Symbol(myDescription)

console.log(mySymbol.toString()); // Symbol(myDescription)

console.log(mySymbol.description); // myDescription

Function.prototype.toString - 修订版

我们之前已经在函数原型中使用了toString方法,但是在 ES2019 中它已被修改并包含函数内的注释,请注意它在Arrow Functions上不起作用。

function /* comment */ foo /* another comment */() {}

// Before
console.log(foo.toString()); // function foo(){}

// Now ES2019
console.log(foo.toString()); // function /* comment */ foo /* another comment */ (){}

// Arrow Syntax
const bar /* comment */ = /* another comment */ () => {};

console.log(bar.toString()); // () => {}

Object.fromEntries

它是 Object.entries 的反向方法,它也是克隆对象的方法之一

const obj = {
 prop1: 1,
 prop2: 2
};

const entries = Object.entries(obj);

console.log(entries); // [ [ 'prop1', 1 ], [ 'prop2', 2 ] ]

const fromEntries = Object.fromEntries(entries);

console.log(fromEntries); // Object { prop1: 1, prop2: 2 }

console.log(obj === fromEntries); // false

注意:任何嵌入式对象/数组都只是通过引用复制。

格式良好的 JSON.stringify

这也是由同一个人提出的,并且与 JSON 超集特征有关 。ES2019 不是将未配对的代理代码点作为单个 UTF-16 代码单元返回,而是用 JSON 转义序列表示它们

// Before
console.log(JSON.stringify("\uD800")); // "�"

// Now ES2019
console.log(JSON.stringify("\uD800")); // "\ud800"

String.prototype trimStart 和 trimEnd

我们已经在 String 原型中使用了trim方法,它删除了字符串开头和结尾之间的空格。但是现在开始介绍 ES2019 的 trimStart和trimEnd

// Trim
const name = "  Codedam ";
console.log(name.trim()); // "Codedam"

// Trim Start
const description = "  Unlocks Secret Codes ";
console.log(description.trimStart()); // "Unlocks Secret Codes "

// Trim End
const category = " JavaScript ";
console.log(category.trimEnd()); // " JavaScript"

Array.prototype flat 和 flatMap

flat方法创建一个新数组,所有子数组元素以递归方式连接到指定的深度。 默认情况下,深度为 1,使数组上第一层嵌套数组变平。

const arr = [1, 2, [3, 4, [5, 6]]];
arr.flat(); // [1, 2, 3, 4, [5, 6]]
arr.flat(2); // [1, 2, 3, 4, 5, 6]

// You can use Infinity to flatten all the nested arrays no matter how deep the array is

const arrExtreme = [1, [2, [3, [4, [5, 6, 7, [8, 9]]]]]];
arrExtreme.flat(Infinity); // [1, 2, 3, 4, 5, 6, 7, 8, 9]

flatMap 类似于 flat 并且与 map 相关,其中它映射数组然后将其展平

const arr = ["Codedam", "is Awsome", "!"];

const mapResult = arr.map(item => item.split(" "));
console.log(mapResult); // [ [ 'Codedam' ], [ 'is', 'Awsome' ], [ '!' ] ]

const flatMapResult = arr.flatMap(chunk => chunk.split(" "));
console.log(flatMapResult); // ['Codedam', 'is', 'Awsome', '!'];

其他

强调一下现在 Stage 3 中的一些有用的即将推出的功能。

  • globalThis
  • BigInt
  • import()
  • Legacy RegEx
  • Private instance methods and accessors
  • String.prototype.matchAll

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js设置cookie过期及清除浏览器对应名称的cookie
Oct 24 Javascript
javascript获取form里的表单元素的示例代码
Feb 14 Javascript
javascript父、子页面交互技巧总结
Aug 08 Javascript
jquery实现图片水平滚动效果代码分享
Aug 26 Javascript
深入理解JavaScript中的call、apply、bind方法的区别
May 30 Javascript
Web程序员必备的7个JavaScript函数
Jun 14 Javascript
10道典型的JavaScript面试题
Mar 22 Javascript
vue-router 中router-view不能渲染的解决方法
May 23 Javascript
对Vue table 动态表格td可编辑的方法详解
Aug 28 Javascript
值得收藏的八个常用的js正则表达式
Oct 19 Javascript
JavaScript实现简单轮播图效果
Dec 01 Javascript
JS实现将对象转化为数组的方法分析
Jan 21 Javascript
echarts实现词云自定义形状的示例代码
Feb 20 #Javascript
JS拖拽排序插件Sortable.js用法实例分析
Feb 20 #Javascript
详解webpack 最简打包结果分析
Feb 20 #Javascript
jQuery表单元素过滤选择器用法实例分析
Feb 20 #jQuery
jQuery内容过滤选择器与子元素过滤选择器用法实例分析
Feb 20 #jQuery
小程序红包雨的实现示例
Feb 19 #Javascript
vue动态添加路由addRoutes之不能将动态路由存入缓存的解决
Feb 19 #Javascript
You might like
dede全站URL静态化改造[070414更正]
2007/04/17 PHP
wiki-shan写的php在线加密的解密程序
2008/09/07 PHP
Look And Say 序列php实现代码
2011/05/22 PHP
php实现的IMEI限制的短信验证码发送类
2015/05/05 PHP
Yii2第三方类库插件Imagine的安装和使用
2017/07/06 PHP
jQuery客户端分页实例代码
2013/11/18 Javascript
js实现每日自动换一张图片的方法
2015/05/04 Javascript
理解和运用JavaScript的闭包机制
2015/08/13 Javascript
JavaScript 对象深入学习总结(经典)
2015/09/29 Javascript
jQuery Mobile 触摸事件实例
2016/06/04 Javascript
JS动态给对象添加事件的简单方法
2016/07/19 Javascript
jQuery实现点击后高亮背景固定显示的菜单效果【附demo源码下载】
2016/09/21 Javascript
js仿微信语音播放实现思路
2016/12/12 Javascript
微信小程序Server端环境配置详解(SSL, Nginx HTTPS,TLS 1.2 升级)
2017/01/12 Javascript
node.js+jQuery实现用户登录注册AJAX交互
2017/04/28 jQuery
JavaScript异步上传图片文件的实例代码
2017/07/04 Javascript
nodejs构建本地web测试服务器 如何解决访问静态资源问题
2017/07/14 NodeJs
javascript、php关键字搜索函数的使用方法
2018/05/29 Javascript
原生JavaScript实现remove()和recover()功能示例
2018/07/24 Javascript
Vue中mintui的field实现blur和focus事件的方法
2018/08/25 Javascript
element实现合并单元格通用方法
2019/11/13 Javascript
el-table树形表格表单验证(列表生成序号)
2020/05/31 Javascript
echarts 使用formatter 修改鼠标悬浮事件信息操作
2020/07/20 Javascript
用Python操作字符串之rindex()方法的使用
2015/05/19 Python
详细解读Python中解析XML数据的方法
2015/10/15 Python
django.db.utils.ProgrammingError: (1146, u“Table‘’ doesn’t exist”)问题的解决
2018/07/13 Python
python 多线程将大文件分开下载后在合并的实例
2018/11/09 Python
python实现多张图片拼接成大图
2019/01/15 Python
使用PyQt4 设置TextEdit背景的方法
2019/06/14 Python
Anaconda和ipython环境适配的实现
2020/04/22 Python
村容村貌整治方案
2014/05/21 职场文书
医院领导班子查摆问题对照检查材料思想汇报
2014/10/08 职场文书
三好学生个人总结
2015/02/15 职场文书
卫生主题班会
2015/08/14 职场文书
大学迎新生欢迎词
2015/09/29 职场文书
导游词之苏州寒山寺
2019/12/05 职场文书