就在刚4个小时前,TC39将以下特性加入到了 ES2019 中。让我们来看看这些新的特性给我们带来了什么样的改变。
ES2019 新特性:
➡️ Array#{flat,flatMap}
➡️ Object.fromEntries
➡️ String#{trimStart,trimEnd}
➡️ Symbol#description
➡️ try { } catch {} // optional binding
➡️ JSON ⊂ ECMAScript
➡️ well-formed JSON.stringify
➡️ stable Array#sort
➡️ revised Function#toString
JSON ⊂ ECMAScript (JSON superset)
行分隔符(U + 2028)和段分隔符(U + 2029)符号现在允许在字符串文字中,与JSON匹配。 以前,这些符号在字符串文字中被视为行终止符,因此使用它们会导致SyntaxError异常。
well-formed JSON.stringify
更加友好的 JSON.stringify (修复了对于一些超出范围的 unicode 展示错误的问题。)
如果输入 Unicode 格式但是超出范围的字符,在原先JSON.stringify返回格式错误的Unicode字符串:
JSON.stringify('\uD800');
// → '"�"'
现在实现了一个改变JSON.stringify的第3阶段提案,因此它为其输出转义序列,使其成为有效Unicode(并以UTF-8表示):
JSON.stringify('\uD800');
// → '"\\ud800"'
在 chrome 控制台输出的是 '"\ud800"' ,但只是一个显示值, 真实值为'"\\ud800"'。
JSON.stringify('\uD800') === '"\\ud800"';
// → true
stable Array#sort
在以前,sort 函数中,10个以上元素的数组 V8 使用不稳定的QuickSort(快排。现在,使用稳定的TimSort算法。)
TimSort算法: en.wikipedia.org/wiki/Timsor…
revised Function#toString
Function.prototype.toString()现在返回精确字符,包括空格和注释。原先和现在的比较:
// Note the comment between the `function` keyword
// and the function name, as well as the space following
// the function name.
function /* a comment */ foo () {}
// Previously:
foo.toString();
// → 'function foo() {}'
// ^ no comment
// ^ no space
// Now:
foo.toString();
// → 'function /* comment */ foo () {}'
Array #{flat, flatMap}
数组降维,递归地将数组展平到指定的深度,默认为1。
// Flatten one level:
const array = [1, [2, [3]]];
array.flat();
// → [1, 2, [3]]
// Flatten recursively until the array contains no more nested arrays:
array.flat(Infinity);
// → [1, 2, 3]
[2, 3, 4].flatMap((x) => [x, x * 2]);
// → [2, 4, 3, 6, 4, 8]
2019.1.31 更新
[2, 3, [2]].flatMap((x) => x + 1);
// [3, 4, "21"]
刚刚看到有人对这个结果有疑问,以为是flatMap内部有什么操作。 其实这个是 addition-operator-plus(+)
的原因。 + 会通过 toprimitive
把数组转化为基础类型String。所以就是 [2] + 1 转化为 “2” + 1 === “21”。下面是佐证:
tc39.github.io/ecma262/#se… tc39.github.io/ecma262/#se…
Object.fromEntries
Object.fromEntries(Object.entries(object))≈ 对象
它类似于Lodash的_.fromPairs。
String#{trimStart,trimEnd}
前后的空白符可以指定一边去除。
const string = ' hello world ';
string.trimStart();
// → 'hello world '
string.trimEnd();
// → ' hello world'
string.trim();
// → 'hello world'
Symbol.prototype.description
通过工厂函数Symbol()创建符号时,您可以选择通过参数提供字符串作为描述:
const sym = Symbol('The description');
以前,访问描述的唯一方法是将符号转换为字符串:
assert.equal(String(sym), 'Symbol(The description)');
现在引入了getter Symbol.prototype.description以直接访问描述:
assert.equal(sym.description, 'The description');
try {} catch {}
现在try {} catch {} 有了更加简便的方法,变成了可选型。
在以前
try {} catch (e) {}
现在
更多提案:
更多请关注
今天的文章🎉喜大普奔,ES2019登场分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/15530.html