ES10(ECMAScript2019)特征预览
2019 年 1 月末的时候,ECMA TC39 终于确定了 ES2019 版 JavaScript 的新增内容,ES2019 将会增加 arrays, objects, strings, symbols, try/catch 和 JSON 等方面的特征。
Array#{flat,flatMap}
Array 的原型链上增加了新的两个方法:Array.flat(tc39 proposal) 和 Array.flat(tc39 proposal) 能够进行扁平化多维数组:
js1var arr = [1, 2, 3, [4, 5, 6, [7, 8, 9, [10, 11, 12]]]]; 2arr.flat(); // [1, 2, 3, 4, 5, 6, Array(4)]
等同于arr.flat(1)
javascript1arr.flat(1); // [1, 2, 3, 4, 5, 6, Array(4)]
逐个展开:
javascript1arr.flat().flat() // [1, 2, 3, 4, 5, 6, 7, 8, 9, Array(3)] 2arr.flat().flat().flat() // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] 3// 超出可扁平化范围结果保持不变 4arr.flat().flat().flat().flat() // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] 5// 当然也等同于 6arr.flat(2); // [1, 2, 3, 4, 5, 6, 7, 8, 9, Array(3)] 7arr.flat(3); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] 8arr.flat(Infinity); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
flatMap()
方法类似于数组的map
方法,对数组的每一项使用传入的function
,结果得到的是扁平化的数组,值得注意的是所有的结果将不会折叠,而是展示为一维数组:
js1var arr = [1, 2, 3, [4, 5, 6, [7, 8, 9, [10, 11, 12]]]]; 2arr.flatMap(item => item * 2); // [2, 4, 6, NaN] 3// map vs flatMap 4var arr = [1, 2, 3, 4]; 5arr.map(item => [item, item * 2]); // [Array(2), Array(2), Array(2), Array(2)] 6arr.flatMap(item => [item, item * 2]); // [1, 2, 2, 4, 3, 6, 4, 8]
BigInt
BigInt 是一个新的类型,用于表达大于 2^53 的值
Object.fromEntries
我们已经知道可以使用Object.entries
返回对象自身可枚举属性键值对数组,而Object.fromEntries(tc39 proposal)则可以看做是这一过程的逆转,用数组返回可枚举对象,loadash里提供了_.fromPairs(pairs)类似的方法。
js1var obj = { foo: 1, baz: 2 }; 2Object.entries(obj); // [Array(2), Array(2)] => [['foo', 1], ['baz', 2]] 3Object.fromEntries([['foo', 1], ['baz', 2]]); // {foo: 1, baz: 2}
String#{trimStart,trimEnd}
这两个方法应该是弥补trim
的不足,trim会直接把两头的空白均移除,trimStart()
方法用于移除字符串开头的空白,trimEnd()
用于移除字符串末尾的空白。
js1var str = ' ECMAScript 2019 '; 2str.trim(); // "ECMAScript 2019" 3str.trimStart(); // "ECMAScript 2019 "
Symbol.prototype.description
Symbol类型增加description
属性,返回Symbol对象的可选描述的字符串。
js1Symbol('ECMAScript2019').description; // ECMAScript2019 2typeof Symbol('ECMAScript2019').description; // string 3Symbol('').description; // "" 4Symbol().description; // undefined
try { } catch {} // optional binding
opitionam bindingtc39 proposal catch参数可选。经常会有这种情况,并没有使用到catch内的参数:
js1try { 2 // do something when success 3} catch (unused) { 4 // do something when error 5} 6
之后可以这样写:
javascript1try { 2 // ... 3} catch { 4 // ... 5}
JSON ⊂ ECMAScript
JSON也有两处的优化:行分隔符(U+2028)和段分隔符(U+2029)符号现在允许在字符串文字中,与JSON匹配。 以前,这些符号在字符串文字中被视为行终止符,因此使用它们会导致SyntaxError异常。
javascript1eval('"\u2028"'); // ""
优化JSON.stringify
改进了JSON.Stringify()
方法,防止返回不符合规范Unicode字符串。
javascript1// 之前 2JSON.stringify('\uD800'); // '"�"' 3// 之后 4JSON.stringify('\uD800'); // '"\\ud800"'
Function.prototype.toString
toString()方法现在能返回源代码字符串,包括空行和注释:
javascript1function /* a comment */ foo () {} 2foo.toString() // "function /* a comment */ foo () {}" 3
Array.prototype.sort
ECMAScript2019版的sort
会确保Array.sort方法是稳定的。
之前总结的 ES6 新特征点这 => ES6(ECMAScript 6.0)新特征。