另一个标准ECMA-402则包含了一些国际化的API,提供给ECMAScript核心API选择性支持。* X; t& v, e7 o2 W3 ?1 |! k
一、.at(), k/ [# l. l" a {* Y" I: U
这是个挺不错的新语法。其他有些语言是可以用 arr[-1] 来获取数组末尾的元素,但是对于 JS 来说这是实现不了的事情。因为 [key] 对于对象来说就是在获取 key 对应的值。数组也是对象,对于数组使用 arr[-1] 就是在获取 key 为 -1 的值。 - c. K+ L: O. z 由于以上原因,我们想获取末尾元素就得这样写 arr[arr.length - 1],以后有了 at 这个方法,我们就可以通过 arr.at(-1) 来拿末尾的元素了,另外同样适用类数组、字符串。 3 ?4 L1 G. \, T. }4 u) D# ~5 O
// Polyfill
function at(n) {
// ToInteger() abstract op
n = Math.trunc(n) || 0;
// Allow negative indexing from the end
if(n < 0) n += this.length;
// OOB access is guaranteed to return undefined
if(n < 0 || n >= this.length) return undefined;
// Otherwise, this is just normal property access
return this[n];
}
二、顶层 await + D+ m. V" B4 a: L2 g0 H4 A await 都得用 async 函数包裹大家肯定都知道,这个限制导致我们不能在全局作用域下直接使用 await,必须得包装一下。有了这个提案以后,大家就可以直接在顶层写 await 了,算是一个便利性的提案。目前该提案已经进入阶段 4,板上钉钉会发布。另外其实 Chrome 近期的更新已经支持了该功能。 ! S- M3 j2 s9 {# x- h & Z/ v. h$ a# p& V2 w Z+ @6 g三、Error Cause& ?; k$ z: S. @8 J
这个语法主要帮助我们便捷地传递Error。一旦可能出错的地方一多,实际就不清楚错误到底是哪里产生的。如果希望外部清楚的知道上下文信息的话,需要封装以下error。 6 y* c' ^) N2 N" C( n
let result = exclaim(capitalize(doubleSay("hello")));
result //=> "Hello, hello!"
let result = "hello"
|> doubleSay
|> capitalize
|> exclaim;
result //=> "Hello, hello!"
这只是对于单个参数的用法,其它的用法有兴趣的读者可以自行阅读提案,其中涉及到了特别多的内容,这大概也是导致推进阶段慢的原因吧。& j5 w5 E! B m/ ^. {/ F3 b 五、新的数据结构:Records & Tuples " [/ C* j: e b: Y1 w; } 这个数据结构笔者觉得发布以后会特别有用,总共新增了两种数据结构,可以通过#来声明: 4 p0 e6 ?0 T# a) `, g! [