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 相关文章推荐
JSON 学习之JSON in JavaScript详细使用说明
Feb 23 Javascript
JS+CSS实现弹出全屏灰黑色透明遮罩效果的方法
Dec 20 Javascript
JS模拟Dialog弹出浮动框效果代码
Oct 16 Javascript
js实现新浪微博首页效果
Oct 16 Javascript
javascript HTML5 Canvas实现圆盘抽奖功能
Apr 11 Javascript
js倒计时简单实现代码
Aug 11 Javascript
jQuery实现的购物车物品数量加减功能代码
Nov 16 Javascript
TypeScript学习之强制类型的转换
Dec 27 Javascript
Node.js Mongodb 密码特殊字符 @的解决方法
Apr 11 Javascript
Vue异步组件处理路由组件加载状态的解决方案
Sep 07 Javascript
Vue项目查看当前使用的elementUI版本的方法
Sep 27 Javascript
基于Vue 撸一个指令实现拖拽功能
Oct 09 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+MYSQL的文章管理系统(一)
2006/10/09 PHP
CodeIgniter基本配置详细介绍
2013/11/12 PHP
php打包网站并在线压缩为zip
2016/02/13 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
2020/02/21 PHP
top.location.href 没有权限 解决方法
2008/08/05 Javascript
Mootools 1.2教程 事件处理
2009/09/15 Javascript
javascript Demo模态窗口
2009/12/06 Javascript
javascript中String类的subString()方法和slice()方法
2011/05/24 Javascript
jquery与js函数冲突的两种解决方法
2013/09/09 Javascript
jquery 实现输入邮箱时自动补全下拉提示功能
2015/10/04 Javascript
基本DOM节点操作
2017/01/17 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(二)
2017/01/21 Javascript
vue2.0中vue-cli实现全选、单选计算总价格的实例代码
2017/07/18 Javascript
Vue2.5学习笔记之如何在项目中使用和配置Vue
2018/09/26 Javascript
Layui实现数据表格中鼠标悬浮图片放大效果,离开时恢复原图的方法
2019/09/11 Javascript
解决vue更新路由router-view复用组件内容不刷新的问题
2019/11/04 Javascript
Python实现小数转化为百分数的格式化输出方法示例
2017/09/20 Python
Python中矩阵库Numpy基本操作详解
2017/11/21 Python
Python实现的json文件读取及中文乱码显示问题解决方法
2018/08/06 Python
python被修饰的函数消失问题解决(基于wraps函数)
2019/11/04 Python
Pytorch中膨胀卷积的用法详解
2020/01/07 Python
Keras 利用sklearn的ROC-AUC建立评价函数详解
2020/06/15 Python
套娃式文件夹如何通过Python批量处理
2020/08/23 Python
Python3实现英文字母转换哥特式字体实例代码
2020/09/01 Python
使用PDF.JS插件在HTML中预览PDF文件的方法
2018/08/29 HTML / CSS
兰蔻英国官网:Lancome英国
2019/04/30 全球购物
在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern "C"
2014/08/09 面试题
局域网定义和特性
2016/01/23 面试题
水果连锁超市创业计划书
2014/01/24 职场文书
司机检讨书
2014/02/13 职场文书
音乐教学随笔感言
2014/02/19 职场文书
《鸟岛》教学反思
2014/04/26 职场文书
2014年党的群众路线整改措施思想汇报
2014/10/12 职场文书
2015年公共机构节能宣传周活动总结
2015/03/26 职场文书
旅游项目合作意向书
2015/05/08 职场文书
MySQL COUNT函数的使用与优化
2021/05/10 MySQL