Skip to content

ECMAScript 2019

ECMAScript 2019(ES10)于 2019 年 6 月发布。

核心特性

1. Array.prototype.flat() 和 Array.prototype.flatMap() 方法

  • flat() 方法用于将嵌套的数组“拉平”,使得嵌套的数组变成一个单层数组。可以指定拉平的深度。
  • flatMap() 方法先对数组中的每个元素进行映射,然后再将结果“拉平”。
javascript
const arr = [1, [2, [3, 4]], 5];
console.log(arr.flat(2)); // [1, 2, 3, 4, 5]

const arr2 = [1, 2, 3, 4];
console.log(arr2.flatMap((x) => [x, x * 2])); // [1, 2, 2, 4, 3, 6, 4, 8]

影响

  • 简化嵌套数组的处理:通过 flat() 可以轻松处理多层嵌套的数组结构。
  • 灵活的映射和拉平操作:flatMap() 结合映射和拉平操作,提供了一种更简洁的数组处理方式。

2. Object.fromEntries() 方法

Object.fromEntries() 方法用于将一个键值对的可迭代对象(如数组)转化为一个对象。它是 Object.entries() 的逆操作

javascript
const entries = [
  ["name", "Alice"],
  ["age", 25],
];
const obj = Object.fromEntries(entries);
console.log(obj); // { name: 'Alice', age: 25 }

影响

  • 轻松转换键值对集合为对象:提供了一种简单的方法,将键值对数组转换为对象。
  • 简化反向操作:通过 Object.fromEntries(),可以轻松地将 Map 对象或其他类似的键值对集合转换为普通对象。

3. String.prototype.trimStart() 和 String.prototype.trimEnd() 方法

trimStart()trimEnd() 方法用于分别删除字符串开头和结尾的空白字符(与 trim() 的区别在于它们只处理一端)。

javascript
const str = "  Hello World!  ";
console.log(str.trimStart()); // 'Hello World!  '
console.log(str.trimEnd()); // '  Hello World!'

影响

  • 精确去除空白:允许开发者仅针对字符串的一端去除空白字符,而不是像 trim() 那样同时处理两端。
  • 提升灵活性:提供更精确的字符串处理方法,特别适用于处理格式化输入和输出时

4. Array.prototype.sort() 的稳定性

ES2019 规定了 Array.prototype.sort() 方法的稳定性,这意味着当排序的元素相等时,它们的相对顺序将保持不变。这在之前的 JavaScript 版本中并不是标准行为,可能因实现的不同而有所差异。

javascript
const arr = [
  { name: "Bob", age: 23 },
  { name: "Alice", age: 23 },
  { name: "Eve", age: 30 },
];
const sorted = arr.sort((a, b) => a.age - b.age);
console.log(sorted); // [{ name: 'Bob', age: 23 }, { name: 'Alice', age: 23 }, { name: 'Eve', age: 30 }]

影响

  • 稳定排序:相同值的元素保持原有顺序,确保排序算法在排序等值元素时不会混乱。
  • 提高排序可靠性:对于需要稳定排序(比如多个字段排序)时,ES2019 提供了一个更为可靠的默认排序行为。

5. Symbol.prototype.description 属性

Symbol.prototype.description 属性提供了访问 Symbol 描述的标准方法。之前,Symbol 的描述只能在创建时通过传入字符串来设置,而无法直接获取。

javascript
const sym = Symbol("description");
console.log(sym.description); // 'description'

影响

  • 更直观地访问 Symbol 描述:提供了一个便捷的方式获取 Symbol 的描述信息,避免了直接转换 Symbol 为字符串的需要。
  • 提升代码可读性:增强了对 Symbol 的理解,尤其是在调试和记录日志时。

6. Function.prototype.toString() 方法的规范化

Function.prototype.toString() 方法的行为得到了规范化,确保了返回的函数字符串表示符合规范,并且在所有环境中一致。

javascript
function example() {
  return 42;
}

console.log(example.toString()); // 'function example() { return 42; }'

影响

  • 提高跨环境一致性:以前的浏览器或环境可能会返回不同的函数字符串表示。ES2019 规范化了这一行为,使得返回值更加一致。
  • 增强可调试性:在调试过程中,开发者可以更一致地获取函数体的字符串表示。

7. module 类型支持(ES 模块)

ES2019 为浏览器和 Node.js 提供了对原生模块(ES Module)支持。通过 type="module" 属性,浏览器支持 <script> 标签内直接使用 ES6 的模块语法,Node.js 也开始支持 .mjs 后缀和原生模块系统。

javascript
<script type="module">import {greet} from './greet.js'; greet('Alice');</script>

影响

  • 简化模块化开发:支持原生 ES 模块(ESM),让 JavaScript 开发更加现代化和模块化。
  • 统一模块系统:解决了浏览器和 Node.js 之间模块导入的兼容性问题。

兼容性

Chrome 79+
Firefox 62+
Safari 12+
Edge 79+
IE 不支持
Node 12+

注:兼容性数据可能随着版本的更新而有所调整,建议开发者根据项目的具体需求参考最新的浏览器版本和 Polyfill 支持情况。

总结

ECMAScript 2019(ES10)带来了多个重要的增强特性,尤其是在数组处理、对象转换、字符串操作和符号描述等方面。通过这些新特性,JavaScript 更加高效、简洁,尤其是在处理数据和优化代码结构时,开发者将能够享受到更现代化的编程体验。

参考文献

ECMA-262 2019 规范 👉

Released under the MIT License.