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函数
Jul 21 Javascript
jQuery autocomplate 自扩展插件、自动完成示例代码
Mar 28 Javascript
快速查找数组中的某个元素并返回下标示例
Sep 03 Javascript
用console.table()调试javascript
Sep 04 Javascript
浅谈js函数中的实例对象、类对象、局部变量(局部函数)
Nov 20 Javascript
javascript阻止事件冒泡和浏览器的默认行为
Jan 21 Javascript
基于Vue2的独立构建与运行时构建的差别(详解)
Dec 06 Javascript
JSONP原理及应用实例详解
Sep 13 Javascript
深入理解JavaScript 中的执行上下文和执行栈
Oct 23 Javascript
微信小程序实现手势滑动卡片效果
Aug 26 Javascript
基于Vue中使用节流Lodash throttle详解
Oct 30 Javascript
在vant 中使用cell组件 定义图标该图片和位置操作
Nov 02 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
php中长文章分页显示实现代码
2012/09/29 PHP
PHP二维数组排序的3种方法和自定义函数分享
2014/04/09 PHP
php去掉URL网址中带有PHPSESSID的配置方法
2014/07/08 PHP
php实现转换html格式为文本格式的方法
2016/05/16 PHP
thinkphp5 URL和路由的功能详解与实例
2017/12/26 PHP
Extjs显示从数据库取出时间转换JSON后的出现问题
2012/11/20 Javascript
JavaScript实现弹出子窗口并传值给父窗口
2014/12/18 Javascript
javascript判断变量是否有值的方法
2015/04/20 Javascript
JavaScript实现删除,移动和复制文件的方法
2015/08/05 Javascript
js实现接收表单的值并将值拼在表单action后面的方法
2015/11/23 Javascript
MVC Ajax Helper或Jquery异步加载部分视图
2015/11/29 Javascript
微信小程序 教程之wxapp视图容器 scroll-view
2016/10/19 Javascript
AngularJs基于角色的前端访问控制的实现
2016/11/07 Javascript
详谈Angular路由与Nodejs路由的区别
2017/03/05 NodeJs
vuejs使用FormData实现ajax上传图片文件
2017/08/08 Javascript
详解如何用模块化的方式写vuejs
2017/12/16 Javascript
在Vuex使用dispatch和commit来调用mutations的区别详解
2018/09/18 Javascript
原生JS实现简单的无缝自动轮播效果
2018/09/26 Javascript
基于jquery实现的tab选项卡功能示例【附源码下载】
2019/06/10 jQuery
如何基于layui的laytpl实现数据绑定的示例代码
2020/04/10 Javascript
vant组件中 dialog的确认按钮的回调事件操作
2020/11/04 Javascript
node.js 基于 STMP 协议和 EWS 协议发送邮件
2021/02/14 Javascript
Python实现115网盘自动下载的方法
2014/09/30 Python
解决python删除文件的权限错误问题
2018/04/24 Python
Python下简易的单例模式详解
2019/04/08 Python
基于Python批量生成指定尺寸缩略图代码实例
2019/11/20 Python
用CSS3来实现社交分享按钮
2014/11/11 HTML / CSS
Boutique 1美国:阿联酋奢侈时尚零售商
2017/10/16 全球购物
实习自我评价怎么写
2013/12/02 职场文书
医院办公室主任职责
2013/12/29 职场文书
大学生职业生涯规划范文
2014/01/22 职场文书
旷课检讨书1000字
2014/02/14 职场文书
工作说明书范文
2014/05/07 职场文书
尊师重教演讲稿
2014/09/04 职场文书
房屋授权委托书范本
2014/10/07 职场文书
Android开发手册Chip监听及ChipGroup监听
2022/06/10 Java/Android