ES2019指南

ECMAScript是JavaScript所基于的标准,并且通常缩写为ES。探索有关ECMAScript的所有内容以及ES2019中添加的功能

ESNext是一个始终指示JavaScript的下一版本的名称。

当前的ECMAScript版本是ES2018. It was released in June 2018.

历史上JavaScript版本在夏季已标准化,因此我们可以期待ECMAScript 2019 to be released in summer 2019.

所以在撰写本文时,ES2018已发布,并且ESNext是ES2019

ECMAScript标准的提案分阶段进行。阶段1-3是新功能的孵化器,达到阶段4的功能将作为新标准的一部分最终确定。

在撰写本文时,我们有许多功能Stage 4。我将在本节中介绍它们。主要浏览器的最新版本应该已经实现了其中的大多数。

  • Array.prototype.{flat,flatMap}
  • 可选的捕获绑定
  • Object.fromEntries()
  • String.prototype.{trimStart,trimEnd}
  • Symbol.prototype.description
  • JSON改进
  • 格式良好JSON.stringify()
  • Function.prototype.toString()

其中一些更改主要供内部使用,但也知道发生了什么也很好。

第3阶段还有其他功能,在接下来的几个月中可能会升级到第4阶段,您可以在以下GitHub存储库中查看它们:https://github.com/tc39/proposals

Array.prototype.{flat,flatMap}

flat()是一种新的数组实例方法,可以从多维数组创建一维数组。

例子:

['Dog', ['Sheep', 'Wolf']].flat()
//[ 'Dog', 'Sheep', 'Wolf' ]

默认情况下,它仅“展平”到一个级别,但是您可以添加一个参数来设置要将阵列展平到的级别数。设置为Infinity具有无限的水平:

['Dog', ['Sheep', ['Wolf']]].flat()
//[ 'Dog', 'Sheep', [ 'Wolf' ] ]

['Dog', ['Sheep', ['Wolf']]].flat(2)
//[ 'Dog', 'Sheep', 'Wolf' ]

['Dog', ['Sheep', ['Wolf']]].flat(Infinity)
//[ 'Dog', 'Sheep', 'Wolf' ]

如果您熟悉JavaScriptmap()数组的方法,您知道使用它可以对数组的每个元素执行一个函数。

flatMap()是一个新的Array实例方法,它结合了flat()map()。当调用返回在map()回调中返回数组的函数时,此函数很有用,但是您希望得到的数组是平坦的:

['My dog', 'is awesome'].map(words => words.split(' '))
//[ [ 'My', 'dog' ], [ 'is', 'awesome' ] ]

['My dog', 'is awesome'].flatMap(words => words.split(' '))
//[ 'My', 'dog', 'is', 'awesome' ]

可选的捕获绑定

有时我们不需要将参数绑定到try / catch的catch块。

我们以前不得不做:

try {
  //...
} catch (e) {
  //handle error
}

即使我们永远不必使用e分析错误。现在我们可以简单地忽略它:

try {
  //...
} catch {
  //handle error
}

Object.fromEntries()

对象有一个entries()方法,因为ES2017

它返回一个包含所有对象自身属性的数组,作为[key, value]对:

const person = { name: 'Fred', age: 87 }
Object.entries(person) // [['name', 'Fred'], ['age', 87]]

ES2019引入了新的Object.fromEntries()方法,可以从以下属性数组创建新对象:

const person = { name: 'Fred', age: 87 }
const entries = Object.entries(person)
const newPerson = Object.fromEntries(entries)

person !== newPerson //true

String.prototype.{trimStart,trimEnd}

该功能已经成为v8 / Chrome的一部分了将近一年,它将在ES2019中进行标准化。

trimStart()

从原始字符串的开头返回删除了空白的新字符串

'Testing'.trimStart() //'Testing'
' Testing'.trimStart() //'Testing'
' Testing '.trimStart() //'Testing '
'Testing '.trimStart() //'Testing'

trimEnd()

返回一个新字符串,该字符串从原始字符串的末尾删除了空白

'Testing'.trimEnd() //'Testing'
' Testing'.trimEnd() //' Testing'
' Testing '.trimEnd() //' Testing'
'Testing '.trimEnd() //'Testing'

Symbol.prototype.description

现在,您可以检索象征通过访问其description属性,而不必使用toString()方法:

const testSymbol = Symbol('Test')
testSymbol.description // 'Test'

JSON改进

在进行此更改之前,不允许将行分隔符(\ u2028)和段落分隔符(\ u2029)符号解析为JSON格式

使用JSON.parse(),这些字符导致SyntaxError但是现在,它们可以按照JSON标准的定义正确解析。

格式良好JSON.stringify()

修复JSON.stringify()处理代理UTF-8代码点(U + D800至U + DFFF)时输出。

进行此更改之前JSON.stringify()将返回格式错误的Unicode字符(“。”)。

现在,可以使用以下命令将那些替代代码点安全地表示为字符串JSON.stringify(),并使用JSON.parse()

Function.prototype.toString()

函数始终具有一个称为的实例方法toString()它返回一个包含功能代码的字符串。

ES2019引入了对返回值的更改,以避免剥离注释和其他字符(如空格),以准确地代表所定义的函数。

如果以前我们有:

function /* this is bar */ bar () {}

行为是这样的:

bar.toString() //'function bar() {}

现在的新行为是:

bar.toString(); // 'function /* this is bar */ bar () {}'

免费下载我的JavaScript初学者手册


更多js教程: