ECMAScript 2017 (ES8)新特性

   最近得知Ecma国际发布了第八版的ECMAScript语言规范,也就是我们通常喊的es6、es7后的es8了,官方叫法不用猜了肯定是ECMAScript 2017了。表示前端发展这么快有点小小的心累啊,罢了不多说就是干吧!

ECMAScript 2017 新特性如下:

  1. Object.values/Object.entries;
  2. 字符串填充;
  3. Object.getOwnPropertyDescriptor;
  4. 尾随逗号;
  5. 异步函数;
  6. 共享内存和原子
    等。。。
    (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的简短教程。

你可能感兴趣的:(javaScript)