1. 可选择的catch绑定

在Node 10+ 支持

举个栗子,我们在写代码的时候经常会出现判断一个字符串是否是json,如果是json那么就 JSON.parse 一下,如果不是就不做处理,于是就有下面这种代码:

  1. let parseResult = someString;
  2. try {
  3. parseResult = JSON.parse(parseResult);
  4. } catch (unused) {
  5. }

通过这个特性引入的语法可以允许省略 catch 绑定的入参和其周围的圆括号,例如:

  1. let parseResult = someString;
  2. try {
  3. parseResult = JSON.parse(parseResult);
  4. } catch { }

2. Symbol 对象的描述字符串

在Node 11+支持

我们大概指定每个从 Symbol() 返回的 symbol 值都是唯一的,而且这个值也可以作为对象属性的标识符。 通常声明了一个 Symbol 对象,那么调用它的 toString 返回的是一个包裹了 Symbol 的字符串,例如:

  1. Symbol(123).toString();
  2. // "Symbol(123)"

而且 Symbol 的原始值不能转换为字符串,必须先调用 toString 方法后再当做字符串使用:

  1. Symbol(123)+ "test";
  2. // TypeError: Cannot convert a Symbol value to a string
  3. Symbol(123).toString() + "test";
  4. // "Symbol(123)test"

而新的特性可以通过调用Symbol的description属性来获取描述字符串,而且没有Symbol字符串包裹:

  1. Symbol(123).description
  2. // "123"
  3. Symbol(123) === Symbol(123)
  4. // false
  5. Symbol(123).description === Symbol(123).description
  6. // true
  7. Symbol(123).description + "test";
  8. // "123test"

3. Object.fromEntries

Node 12+

通过 Object.fromEntries 可以把键值对列表转换为一个对象。

  1. const obj = Object.fromEntries([
  2. ["name", "test"],
  3. ["value", "testValue"]
  4. ]);
  5. // Object { name: "test", value: "testValue" }

4. 字符串空白符去除

Node 10+

移除开头,左端的空格

  1. const str = " Node 地下铁! ";
  2. str.trimStart();
  3. str.trimLeft(); // 在之前 Node 版本就支持
  4. // "Node 地下铁! ";

移除结束,右端的空格

  1. const str = " Node 地下铁! ";
  2. str.trimEnd();
  3. str.trimRight(); // 在之前 Node 版本就支持
  4. // " Node 地下铁!";

5. 数组拍平

Node 11+

flat方法将数组所有元素与基于可配置的深度层级(默认为1)进行遍历到的子数组中的元素合并为一个新数组返回。

  1. const arr = ["N", ["o","d"], "e", ["地", "下"], "铁"];
  2. arr.flat();
  3. // ["N", "o", "d", "e", "地", "下", "铁"]
  4. const arr2 = ["N", ["o",["d", ["e", ["地", ["下", ["铁"]]]]]]];
  5. arr2.flat(6);
  6. // ["N", "o", "d", "e", "地", "下", "铁"]

flatMap方法可以传入一个用来处理每一个数据的方法,并且将所有的返回值进行拍平,但是只会拍平1层:

const arr = ["Node", "", "地下铁"]

arr.map(s => s.split(""));
// [["N", "o", "d", "e"],[ ],["地", "下", "铁"]]

arr.flatMap(s => s.split(""));
// ["N", "o", "d", "e", "地", "下", "铁"]

6. 更规范的JSON

Node 12+

在JSON RFC第8.1节中要求使用 UTF-8 编码在各个生态闭环中进行数据交换,但是在之前的JSON中对于UTF8之外的字符能够进行识别返回,那么就导致了:

JSON.stringify('𝌆') === JSON.stringify('\uD834\uDF06')

而所预期的 \uD834\uDF06 通过JSON序列化后应该是 \uD834\uDF06。