最近得知Ecma国际发布了第八版的ECMAScript语言规范,也就是我们通常喊的es6、es7后的es8了,官方叫法不用猜了肯定是ECMAScript 2017了。表示前端发展这么快有点小小的心累啊,罢了不多说就是干吧!
ECMAScript 2017 新特性如下:
- Object.values/Object.entries;
- 字符串填充;
- Object.getOwnPropertyDescriptor;
- 尾随逗号;
- 异步函数;
- 共享内存和原子
等。。。
(ECMAScript 2018 已在制定中。)
一、Object.values/Object.entries
object.values
返回一个数组,成员为参数对象可遍历的键值(不含继承的)。
若属性名为数值,则按照数值从小到大遍历,否则默认排序遍历;
若参数为字符串,则返回由拆分后的每个字符串组成的数组;
若参数为数值,则返回空数组;
若参数为布尔值,则返回空数组。
let obj = { 33:3 , 11:1 , 22:2 },
obj2 = { "三":3 , "一":1 , "二":2 },
obj3 = "Angelababy",
obj4 = 123,
obj5 = true;
console.log( Object.values(obj) ); // [1,2,3]
console.log( Object.values(obj2) ); // [3,1,2]
console.log( Object.values(obj3) );
// ["A", "n", "g", "e", "l", "a", "b", "a", "b", "y"]
console.log( Object.values(obj4) ); // []
console.log( Object.values(obj5) ); // []
object.entries
返回一个数组,成员为参数对象可遍历的键值对数组(不含继承的),除返回值不同外,其方法与objest.values基本一样。
let obj = { 33:3 , 11:1 , 22:2 },
obj2 = { "三":3 , "一":1 , "二":2 },
obj3 = "Angelababy",
obj4 = 123,
obj5 = true;
console.log( Object.entries(obj) );
// [ ["11",1] , ["22",2] , ["33",3] ]
console.log( Object.entries(obj2) );
// [ ["三",3] , ["一",1] , ["二",2] ]
console.log( Object.entries(obj3) );
// [ ["0","A"] , ["1","n"] , ["2","g"] , ["3","e"] , ["4","l"] , ["5","a"] , ["6","b"] , ["7","a"] , ["8",b"] , ["9","y"] ]
console.log( Object.entries(obj4) ); // []
console.log( Object.entries(obj5) ); // []
二、字符串填充
为了使开发人员更好的控制字符串,提供了以下方法:
string.padStart(maxLength,fillString/可不填)
"abc".padStart(6) // " abc" 未填写填充字符时候以空格填充
"abc".padStart(6,"3") // "333abc"
"abc".padStart(6,"3").length // 6
"abc".padStart(6,"123456") // "123abc" 自动忽略句尾多余的填充字符
"abc".padStart(2,"123456") // "abc" 原字符串大于要求的数据时候则不发生变化返回原字符串
string.padEnd(maxLength,fillString/可不填)
padEnd()方法与padStart()方法类似,只不过填充字符串插在字符串尾部
"123".padEnd(8) // "123 "
"123".padEnd(8,"c") // "123ccccc"
"123".padEnd(8,"c").length // 8
"123".padEnd(8,"123456") // "12312345"
"123".padEnd(2,"123456") // "123"
三、Object.getOwnPropertyDescriptor(obj, prop)
获取指定对象的自身属性描述符。自身属性描述符是指直接在对象上定义(而非从对象的原型继承)的描述符。
var obj = {};
obj.newDataProperty = "abc";
var descriptor = Object.getOwnPropertyDescriptor(obj, "newDataProperty");
//outputs:
//configurable:true
//enumerable:true
//value:"abc"
//writable:true
descriptor.writable = false;
//outputs:
//writable:false
四、函数参数列表与调用中的尾部逗号
此特性使我们在定义或者调用函数时添加尾部逗号而不报错
var arr = [1,2,3] , arr2 = [1,2,3,4,];
console.log(arr); // [1,2,3]
console.log(arr2); // [1,2,3,4] (句尾逗号不会报错)
function fun(x,y,z,){
return x+y+z
}
fun(1,2,3,) // 6 (句尾逗号不会报错)
五、异步函数
ES8 中允许使用 async/await 语法来定义与执行异步函数,async 关键字会返回某个 AsyncFunction 对象;在内部实现中虽然异步函数与迭代器的实现原理类似,但是其并不会被转化为迭代器函数:
异步函数声明: async function foo() {};
异步函数表达式: const foo = async function () {};
异步函数定义:let obj = { async foo() {} };
异步箭头函数: const foo = async () => {};
function fetchTextByPromise() {
return new Promise(resolve => {
setTimeout(() => {
resolve("es8");
}, 2000);
});
}
async function sayHello() {
const externalFetchedText = await fetchTextByPromise();
console.log(`Hello, ${externalFetchedText}`); // Hello, es8
}
sayHello();
console.log(1);
sayHello();
console.log(2);
// 结果:
// 1 (直接输出)
// 2 (直接输出)
// Hello, es8 (2秒后输出)
六、共享内存和原子
Lars Hansen提出了ES2017中 共享内存和Atomics的建议,截至2017年2月,它已在第4阶段中被批准,并包含到规范中。
此功能引入了一个新的低级别Atomics命名空间对象和一个SharedArrayBuffer构造函数,来作为更高级别并发抽象的原始构建块。这使开发人员能够共享多个service worker和核心线程之间的SharedArrayBuffer对象的数据。这种引入带来了巨大的益处,因为可以更轻松地在worker之间共享数据,从而可以改善worker之间的协调。
有关新的Atomics对象和SharedArrayBuffer构造函数的信息,请阅读深入分析或阅读Lars Hansen的简短教程。