主要新特性:
Array.prototype.{flat,flatMap}
Object.fromEntries
次要新功能:
String.prototype.{trimStart,trimEnd}
Symbol.prototype.description
- 可选的
catch
绑定 Array.prototype.sort()
主要是内部的变化:
从 V8 v7.3 / Chrome 73 开始,所有这些 ES2019 功能都默认可用。
flat
方法创建一个新数组,其中所有子数组元素递归连接到该数组中,直到指定的深度。默认深度为 1。
const arr1 = [1, 2, [3, 4]]
arr1.flat() // [1, 2, 3, 4]
const arr2 = [1, 2, [3, 4, [5, 6]]]
arr2.flat() // [1, 2, 3, 4, [5, 6]]
const arr3 = [1, 2, [3, 4, [5, 6]]]
arr3.flat(2) // [1, 2, 3, 4, 5, 6]
const arr4 = [1, 2, [3, 4, [5, 6, [7, 8, [9, 10]]]]]
arr4.flat(Infinity) // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
更多实现技巧可查阅数组扁平化。
flatMap()
方法实际上是 map
和 flat()
方法的组合。
首先,它使用 map
方法映射每个元素,然后将结果压缩成一个新数组。它与 map
连着深度值为 1 的 flat
几乎相同,但 flatMap
通常在合并成一种方法的效率稍微高一些。
const arr = [1, 2, 3, 4]
arr.flatMap((x) => x * 2) // [2, 4, 6, 8]
arr.flatMap((x) => [x * 2]) // [2, 4, 6, 8]
// 只有一层是扁平的
arr.flatMap((x) => [[x * 2]]) // [[2], [4], [6], [8]]
Object.fromEntries()
从给定的键值对构建一个对象。
它接收一个键值对列表,并返回一个对象,其属性由条目给出。它的功能与 Object.entries()
相反。
const entries = new Map([
['apple', 'origin'],
['grapes', 'peach']
])
console.log(Object.fromEntries(entries)) // { apple: 'origin', grapes: 'peach' }
我们可以看到,当我们向 fromEntries()
函数提供一个映射(它成对存储值)时,我们得到了一个对象,该对象与映射中的相应键值对相同。
它原本的名称为 trimRight
和 trimLeft
,但在 ES2019 中,名称被更改为 trimStart
和 trimEnd
,以使它看起来更直观。
trimStart
修剪给定字符串的开头。trimEnd
修剪给定字符串的结尾。
let message = ' Hello '
message.trimStart() // "Hello "
message.trimEnd() // "Hello"
当我们在 JS 中创建一个 Symbol
时,可以指定一个描述,用于以后的调试。取回这个描述的过程有点乏味。我们必须重新构造 Symbol
,并借助 toString()
方法访问描述。
ES10 添加了一个名为 description
的新只读属性,该属性返回 Symbol
的描述。
const symbol = Symbol('This is a Symbol')
console.log(symbol.toString()) // Symbol(This is a Symbol)
console.log(symbol.description) // This is a Symbol
我们可以看到,我们直接使用 description
属性得到 Symbol
的描述。
在 ES10 之前,语法迫使我们为 catch
子句绑定一个异常变量,不管它是否必要。很多时候可以注意到,catch
块只是多余的。ES10 提案使我们能够完全忽略变量,让我们少关心一件事。
try {
const data = JSON.parse(obj)
return true
} catch {
return false
}