当前位置: 首页 > news >正文

通过示例来学习ES2016, 2017, 2018的新特性

译者按: 本文系统地总结了所有的新特性,并用浅显的例子解释。

  • 原文: Here are examples of everything new in ECMAScript 2016, 2017, and 2018
  • 译者: Fundebug

为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,翻译仅用于学习。

一直保持对JavaScript新特性的关注是一件很难的事情,特别是还找不到几个有用的例子去理解它。

本文会辅以有用的例子来讲述TC39中的18个特性,它们分别在ES2016, ES2017和ES2018中加入。 鉴于本文内容很长,我们将分为两个部分来介绍,此为第一部分。

1. Array.prototype.includes

includes是一个Array上很有用的函数,用于快速查找数组中是否包含某个元素。(包括NaN,所以和indexOf不一样)。

2. 指数函数的中缀形式

加/减法我们通常都是用其中缀形式,直观易懂。在ECMAScript2016中,我们可以使用**来替代Math.pow。

1. Object.values()

Object.values()函数和Object.keys()很相似,它返回一个对象中自己属性的所有值(通过原型链继承的不算)。

2. Object.entries()

Object.entries()和Object.keys相关,不过entries()函数会将key和value以数组的形式都返回。这样,使用循环或则将对象转为Map就很方便了。

例子1:

例子2:

3. 字符串追加

提供了两个字符串追加的方法String.prototype.padStart和String.prototype.padEnd,方便我们将一个新的字符串追加到某个字符串的头尾。

'someString'.padStart(numberOfCharcters [,stringForPadding]); 
'5'.padStart(10) // '          5'
'5'.padStart(10, '=*') //'=*=*=*=*=5'
'5'.padEnd(10) // '5         '
'5'.padEnd(10, '=*') //'5=*=*=*=*='
复制代码

这个对于格式化输出很有用!

3.1 padStart例子

我们有一个不同长度元素的数组,我们可以往前面追加0来使得他们打印的长度都为10。

3.2 padEnd例子

同样,通过在后面追加字符串来格式化输出。

const cars = {
  '?BMW': '10',
  '?Tesla': '5',
  '?Lamborghini': '0'
}
Object.entries(cars).map(([name, count]) => {
  //padEnd appends ' -' until the name becomes 20 characters
  //padStart prepends '0' until the count becomes 3 characters.
  console.log(`${name.padEnd(20, ' -')} Count: ${count.padStart(3, '0')}`)
});
//Prints..
// ?BMW - - - - - - -  Count: 010
// ?Tesla - - - - - -  Count: 005
// ?Lamborghini - - -  Count: 000
复制代码

3.3 使用padStart和padEnd来格式化Emojis和其他宽字符

Emojis和宽字符使用多个字节来表示,因此可能使用padStart和padEnd的结果并非如你所愿。

比如:我们追加❤️到heart前面:

//你会发现不仅没有5个桃心,有一个桃心还很奇怪。
'heart'.padStart(10, "❤️"); // prints.. '❤️❤️❤heart'
复制代码

这是因为❤️占有2个字节('\u2764\uFE0F'),而heart本身有5个字节,因此只有5个字节的余地。所以只是追加了2个半的桃心。最后追加的'\u2764'会显示为小黑桃心。

4. Object.getOwnPropertyDescriptors

该函数返回一个对象所有的属性,甚至包括get/set函数。ES2017加入这个函数的主要动机在于方便将一个对象深度拷贝给另一个对象,同时可以将getter/setter拷贝。和Object.assign不同。

Object.assign将一个对象除了getter/setter以外的都深度拷贝了。

将原对象Car拷贝到ElectricCar,你就会发现Object.getOwnPropertyDescriptors拷贝了 getter和setter,而Object.assign没有。

5. 允许在函数参数最后添加逗号

这是一个很小的改动,方便git算法更加方便区分代码职责。我们用一个详细的例子来理解:

值得一提的是,在函数调用的时候,也可以在最后添加逗号。

6. Async/Await

迄今为止,我介绍的特性中最有用的就属这个功能了。Async函数可以帮助我们摆脱“回调地狱”,并且整个代码会更加简洁。

async关键字告诉JavaScript编译器对于标定的函数要区别对待。当编译器遇到await函数的时候会暂停。它会等到await标定的函数返回的promise。该promise要么得到结果、要么reject。

在下面的例子中,getAmount函数调用getUsergetBankBalance两个异步函数。我们可以用promise来实现它,不过用async await更加简洁。

6.1 async函数返回Promise

如果你想获取一个async函数的结果,你需要使用Promise的then语法。

在下面的例子中,我们想用console.log来打印doubleAndAdd的结果,可以使用then语法,将console.log函数作为参数传入。

6.2 并行处理

在上面的例子中,我们显示地调用了await两次,因为每次都等待了1秒钟,因此总计两秒钟。现在,我们可以使用Promise.all函数来让他们并行处理。

6.3 async/await的错误处理

有很多方法来处理错误。

  • 方法1:在函数中使用try-catch

  • 方法2:catch每一个await表达式

因为每一个await表达式都会返回Promise,你可以对一个进行catch操作。

  • 方法3:catch整个async-await函数

关于Fundebug

Fundebug专注于JavaScript、微信小程序、微信小游戏、支付宝小程序、React Native、Node.js和Java实时BUG监控。 自从2016年双十一正式上线,Fundebug累计处理了7亿+错误事件,得到了Google、360、金山软件、百姓网等众多知名用户的认可。欢迎免费试用!

版权声明

转载时请注明作者Fundebug以及本文地址:
blog.fundebug.com/2018/07/17/…

相关文章:

  • 从团队级到企业级 Worktile推动企业转型、升级
  • jupyter notebook常用快捷键
  • Java代码性能优化总结
  • SMSSDK合理运用好友关系的方法
  • Java Proxy Pattern(代理模式)
  • BZOJ1015 星球大战starwar
  • 教你找回 git stash 数据中的数据
  • 驱动移植过程中DMA内存相关接口替换
  • HBase二级索引实现方案
  • 前向星和链式前向星
  • 开源PaaS Rainbond v3.7.0-rc1版本更新,系统生产稳定性大幅提升
  • zabbix3.0.4监控linux主机cpu使用率超过90%的时候报警
  • corosync + pacemaker +mysql +nfs
  • Java+大数据开发——Hadoop集群环境搭建(二)
  • python 循环列表的同时做删除操作
  • [译] React v16.8: 含有Hooks的版本
  • angular2 简述
  • Electron入门介绍
  • iOS编译提示和导航提示
  • Leetcode 27 Remove Element
  • mysql常用命令汇总
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • oldjun 检测网站的经验
  • PHP面试之三:MySQL数据库
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 构建工具 - 收藏集 - 掘金
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 移动端唤起键盘时取消position:fixed定位
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • $.ajax()
  • $refs 、$nextTic、动态组件、name的使用
  • (附源码)ssm码农论坛 毕业设计 231126
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (转) 深度模型优化性能 调参
  • (转)【Hibernate总结系列】使用举例
  • (转)jdk与jre的区别
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .net MVC中使用angularJs刷新页面数据列表
  • .net wcf memory gates checking failed
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • .net反编译工具
  • /usr/lib/mysql/plugin权限_给数据库增加密码策略遇到的权限问题
  • [20150321]索引空块的问题.txt
  • [Ariticle] 厚黑之道 一 小狐狸听故事
  • [C++]命名空间等——喵喵要吃C嘎嘎
  • [DAX] MAX函数 | MAXX函数
  • [ERROR] Plugin 'InnoDB' init function returned error
  • [Hive] 常见函数
  • [javaSE] 看知乎学习工厂模式
  • [LeetCode] NO. 387 First Unique Character in a String
  • [Linux]创建新用户并授予root权限