ECMAScript6 的开发花费了四年之久,之后TC-39决定缩短开发周期,采用年度周期来发布语言的新特性,以确保语言的迭代速率与性能的快速发展。
由于开发周期的缩短,可想而知的是此后每个新的ES版本拥有的新特性会比从ES5时代变到ES6时代时少许多。为了标识这种新的变化,新版本号不再重点描述版本的数字代号,而是改为指明规范发布的年份,因此,ES6也被称为ES2015,而ES8也正式被命名为ES2017。TC-39小组决定将来所有的ES版本都采用如上的年份命名规则。
EcmaScript 8 或 EcmaScript 2017,由去年6月底由 TC39 正式发布至今已有一整年的时间了。
下面笔者将简要介绍ES8的一些主要新特性:
一、padStart
padStart() 方法会用第二个参数中指定的填充字符串,在当前字符串的头部不断填充,直到它达到第一个参数中指定的目标长度。
ex:
‘es8’.padStart(2); // 'es8'
'es8'.padStart(5); // ' es8'
'es8'.padStart(6, 'woof'); // 'wooes8'
二、padEnd
padEnd() 方法会用第二个参数中指定的填充字符串,在当前字符串的尾部不断填充,直到它达到第一个参数中指定的目标长度。
ex:
‘es8’.padEnd(2); // 'es8'
'es8'.padEnd(5); // 'es8 '
'es8'.padEnd(6, 'woof'); // 'es8woo'
‘es8’.padEnd(7, '6'); // 'es86666'
三、兼容性
Object.values
Object.values()方法返回一个给定对象中所有可枚举属性值的数组,值的顺序与使用
for...in循环的顺序相同(区别在于for-in循环枚举原型链中的属性)。
const obj = { x: 'xxx', y: 1 };
Object.values(obj); // ['xxx', 1]
// 等价于 { 0: 'e', 1: 's', 2: '8' };
const obj = ['e', 's', '8'];
Object.values(obj); // ['e', 's', '8']
// 当使用数值作为键时,返回数组中的每一项的
// 顺序将取决于数值的大小
const obj = { 10: 'xxx', 1: 'yyy', 3: 'zzz' };
Object.values(obj); // [ 'yyy', 'zzz', 'xxx' ]
Object.entries
Object.entries()方法返回一个给定对象中可枚举属性[key, value]对的数组,数组中键值对的排列顺序和使用 for...in循环遍历该对象时返回的顺序一直(区别在于 for...in循环也枚举原型链中的属性)。
const obj = { x: 'xxx', y: 1 };
Object.entries(obj); // [[ 'x', 'xxx'], ['y', 1]]
const obj = ['e', 's', '8'];
Object.entries(obj);
// [['0', 'e'], ['1', 's'], ['2', '8']]
const obj = { 10: 'xxx', 1: 'yyy', 3: 'zzz' };
Object.entries(obj);
// [['1', 'yyy'], ['3', 'zzz'], ['10', 'xxx']]
Object.entries('es8');
Object.getOwnPropertyDescriptors
Object.getOwnPropertyDescriptors()方法用来获取一个对象的所有自身属性的描述符。
const obj = { get es8() { return 888; } };
Object.getOwnPropertyDescriptors(obj, 'es8');
四、Async
async function声明定义了一个异步函数,它返回一个AsyncFunction对象。
function fetchTextByPromise() {
return new Promise(resolve => {
setTimeout( () => {
resolve("es8");
}, 2000);
});
}
async function sayHello() {
const externalFetchedText = await fetchTextByPromise();
console.log(`Hello, ${externalFecthedText}`);
}
console.log(1);
sayHello();
console.log(2);
五、Shared memory and atomics
当共享内存时,多个线程可以在内存中读取和写入相同的数据。原子操作确保可预测的值被写入和读取,即在下一个操作开始之前完成本次操作,并且该次操作不会被中断。接下来我们要介绍Atomics命名空间下的ShareArrayBuffer。
ShareArrayBuffer
ShareArrayBuffer对象用来表示一个泛型的,固定长度的原生二进制数据缓冲区,类似于ArrayBuffer对象。但在某种程度上,它们能被用于在共享内存上创建视图。与ArrayBuffer不同的是,ShareArrayBuffer不能被移除。
// 为了使用 SharedArrayBuffer 对象从一个位于集群中的
// 代理到另一个代理,实现共享内容,需要运用 postMessage 和 structured cloning。
var sab = new SharedArrayBuffer(1024);
worker.postMessage(sab);
... ...