一个小伙

看看 JaveScript ES2019

2019.02.12

一起看看在 ES2019 中带来的新特性。

New

  • Array.prototype.{flat,flatMap}
  • Object.fromEntries
  • String.prototype.{trimStart,trimEnd}
  • Optional Catch Binding
  • JSON ⊂ ECMAScript
  • Well-formed JSON.stringify
  • Function.prototype.toString
  • Symbol.prototype.description

Array.prototype.{flat,flatMap}

flat()

flat()方法会递归到指定深度将所有子数组连接,并返回一个新数组。

var newArray = arr.flat(depth);
// depth: 可选,指定嵌套数组中的结构深度,默认值为1。
// demo

var arr1 = [1, 2, [3]];
arr1.flat();
// [1, 2, 3]

var arr2 = [1, 2, [3, [4, 5]]];
arr2.flat();
// [1, 2, 3, [4, 5]]

var arr3 = [1, 2, [3, [4, 5]]];
arr3.flat(2);
// [1, 2, 3, 4, 5]

flatMap()

flatMap() 方法首先使用映射函数映射每个元素,然后将结果压缩成一个新数组。等于 map + 深度值 1 的 flat。

// demo
var arr1 = [1, 2, 3];

arr1.map(x => [x * 2]);
// [[2], [4], [6]]

arr1.flatMap(x => [x * 2]);
// [2, 4, 6]

Object.fromEntries

方法 Object.fromEntries() 把键值对列表转换为一个对象。是 Object.entries 的反转。

// demo

const map = new Map([["name", "demo"], ["age", 18]]);
const obj = Object.fromEntries(map);
console.log(obj); // { name: "demo", age: 42 }

const arr = [["0", "a"], ["1", "b"]];
const obj = Object.fromEntries(arr);
console.log(obj); // { 0: "a", 1: "b"}

String.prototype.{trimStart,trimEnd}

trimStart() 方法从字符串的开头删除空格。trimLeft()别名; trimRight() 方法从一个字符串的右端移除空白字符。trimRight()别名。 不会直接修改原字符串本身。

// demo

var greeting = "   Hello world!   ";

console.log(greeting);
// "   Hello world!   ";

console.log(greeting.trimStart());
// "Hello world!   ";

console.log(greeting.trimEnd());
// "Hello world!";

Optional Catch Binding

try catch 异常捕获变成可选。

// Before
try {
   ...
} catch(error) {
   ...
}

// After
try {
   ...
} catch {
   ...
}

JSON ⊂ ECMAScript

现在,字符串文字中允许使用行分隔符(U + 2028)和段落分隔符(U + 2029)符号。以前会导致 SyntaxError 异常。

eval('"\u2028"');
eval('"\u2029"');

Well-formed JSON.stringify

更加友好的 JSON.stringify,修复了一些超出范围的 unicode 展示。

Function.prototype.toString

.toString()现在返回源代码文本的精确切片,包括空格和注释。

function /* a comment */ foo() {}

// Previously:
foo.toString();
// 'function foo() {}'
//             ^ no comment
//               ^ no space

// Now:
foo.toString();
// 'function /* comment */ foo () {}'

Symbol.prototype.description

description 是一个只读属性,它会返回 Symbol 对象的可选描述的字符串。

Symbol("desc").toString(); // "Symbol(desc)"
Symbol("desc").description; // "desc"
Symbol("").description; // ""
Symbol().description; // undefined

// well-known symbols
Symbol.iterator.toString(); // "Symbol(Symbol.iterator)"
Symbol.iterator.description; // "Symbol.iterator"

// global symbols
Symbol.for("foo").toString(); // "Symbol(foo)"
Symbol.for("foo").description; // "foo"

More

tc39/proposals: https://github.com/tc39/proposals

参考: What’s new in JavaScript ES2019 > ECMAScript - A Taste from ES2019 (ES10) > MDN web docs