2017年6月底es2017不期而至; 截止目前es8是ecmascript规范的第九个版本;自es2015开始ECMA协会将每年发布一个版本并将年号作为版本号;算了 直接看下es2017的新特性:

1.异步函数

ECMAScript 2017功能“ 异步函数 ”由Brian Terlson提出。其是Generator的语法糖,简单讲就是用async关键字代替了*,用await(只能在异步函数中使用)关键字代替了yield,并且不需要next调用直接全部执行换言之没有惰性求值如下

声明:async function testAsync ( ) { return.... } // 用async 声明一个异步函数

调用:testAsync ().then( result => {....} ).catch(e => {...})//此处 result 为异步函数最终返回值 也就是上面return的值 catch用法同generator一致;

await: await 命令后面是一个 Promise 对象。如果不是,会被转成一个立即resolve的 Promise 对象, 若Promise 变为reject,则整个async函数都会中断执行,并且reject的参数会被catch捕获;

接着看代码:

function add(num){
return ++num
}
async function testAasync(num){
let a = await add(num);
let b = await add(a);
if(a!==3){
throw Error("error")
}
return {a,b};
}
testAasync(2).then(result =>{
console.log(result );// {a:3,b:4}
}).catch(e=>console.log(e));
testAasync(1).then(result =>{
console.log(result );
}).catch(e=>console.log(e));// error //----------------------------------------------------------------------

async function testAasync(num){
  let c = await 789;//await 后面不是promise会被转成一个立即resolve的 Promise 对象
  let a = await Promise.reject('error');
  console.log("这里不会打印,下面也不会执行,reject的参数被下面catch捕获并打印");
  let b = await 123;
  return b;
}
testAasync(2).then(x=>{
  console.log(x);
}).catch( e => console.log(e) );// error

2.对象尾逗号

es2017允许函数对象的定义调用时参数可以加入尾逗号,以及json对象array对象都允许

function test(num1,num2,){}
test(1,2,);
let arr = [1,2,3,]
let obj = {a:1,b:2,}

3.String.padStart和String.padEnd

padStart:[length,string] 在字符串首位开始添加string直到满足length为止并返回新的字符串;

  1.若string+原字符串的长度大于length, 则多余string不添加;

  2.若string+原字符串的长度小于length, 则重复string,直到满足length;

padEnd: [length,string] 与padStart一致 唯一区别是在末尾添加;

console.log ( "test".padStart (8,"123456789123") )//1234test
console.log ( "test".padStart (8,"12") )//1212test
console.log ( "test".padEnd (8,"123456789123") )//test1234
console.log ( "test".padEnd (8,"12") )//test1212

4.Object.values/Object.entries/Object.getOwnpropertyDescriptors

values: [obj],返回obj自身可枚举属性的属性值的集合;

  1.Symbol属性不可获取

  2.原型、继承属性不可获取

let obj = {x:65,a:89,b:1,[Symbol()]:78}
console.log(Object.values(obj))//[65,89,1]
function fn(){}
fn.prototype.c = {x:7}
fn.b = function(){};
console.log(Object.values(fn))//[Function]
var fns = new fn();
console.log(Object.values(fns))//[]

entries:[obj], 与values类似,返回的一个2元素的数组

  1.若obj为数组,2元素数组第0项为第1项在原数组所在下标

  2.若obj具有key-value的结构则2元素数组第0项为key第1项为value;

let obj = [1,2,3,]
console.log(Object.entries(obj))//[ ['0',1], ['1',2], ['2',3] ]
let obj = {a:1,b:2}
console.log(Object.entries(obj))//[ ['a',1], ['b',2] ]

getOwnpropertyDescriptors: [obj],返回obj对象的属性描述符 具体应用请点击传送门

5.共享内存、原子对象

共享内存【详细文档】:SharedArrayBuffer(byteLength) // 接受一个可选长度作为参数,其指定共享内存大小;

  1.IsSharedArrayBuffer(o)// 判断o是否为共享数据块;

  2.SharedArrayBuffer.prototype  // 默认 不可写&不可配置%不可枚举

  3. SharedArrayBuffer.prototype.constructor // 初始值SharedArrayBuffer的内在对象,可通过指定第一个参数修改;

  4.SharedArrayBuffer.prototype.slice( start, end ) // 默认 不可写&可配置%不可枚举 ;

原子对象【详细文档】: atomics// 全局对象的原子属性的初始值。原子对象是单个普通对象

  1.原子对象不能用new及当函数调用;

  2.add /sub//加法/减法操作并返回与该运算结果对应的字节值列表 

  3and / or /xor - 进行位操作 并返回与该运算结果对应的字节值列表

  4load - 获取值

  5.wait( typedArray, index, value, timeout )//设置等待唤醒第四个参数为超时

  6.wake( typedArray, index, count )// 唤醒队列中休眠的代理

以上是基础的api 详情可点击相应的详细文档,worker多线程中最大问题就是数据有时不会及时同步也就子线程1与子线程2同事更改数据造成数据不是同步的原子能其中的作用之一就解决了这个问题先看段代码[目录结构为 index.html、js/index.js 、js/worker.js、js/worker2.js]:

//index.js:
const sharedBuffer = new SharedArrayBuffer(32);
const sharedArray = new Int32Array(sharedBuffer);
const w = new Worker("js/worker.js");
const w2 = new Worker("js/worker2.js");
w.postMessage(sharedBuffer);
w2.postMessage(sharedBuffer);
w.onmessage = function(e){
console.log(e.data,sharedArray)
}
w2.onmessage = function(e){
console.log(e.data,sharedArray)
}
//worker.js   self.addEventListener("message",function(e){

    const sharedArray = new Int32Array(e.data);
    for(var i=0;i<100000000;i++){
    sharedArray[0]++;
    }
    postMessage("worker ");
  })

  // worker2.js

  self.addEventListener("message",function(e){
    const sharedArray = new Int32Array(e.data);
    for(var i=0;i<100000000;i++){
    sharedArray[0]++;
    }
    postMessage("worker2");
  })

 

打印结果:

NOTE: 这个值是不稳定的;

下面修改下代码:

// worker.js
self.addEventListener("message",function(e){
const sharedArray = new Int32Array(e.data);
for(var i=0;i<100000000;i++){
Atomics.add(sharedArray,0,1)
}
postMessage("worker ");
})
// worker2.js

  self.addEventListener("message",function(e){
    const sharedArray = new Int32Array(e.data);
    for(var i=0;i<100000000;i++){
    Atomics.add(sharedArray,0,123)
    }
    postMessage("worker2");
  })

 

打印结果如下:

NOTE: 结果也是不稳定的 但总归相差不是很大这块博主也不造哪里出问题了...

最后再看下Atomics的睡眠与唤醒:

  // index.js
   const sharedBuffer = new SharedArrayBuffer(32);
const sharedArray = new Int32Array(sharedBuffer);
sharedArray[1] = 123;
const w = new Worker("js/worker.js");
const w2 = new Worker("js/worker2.js");
w.postMessage(sharedBuffer);
w2.postMessage(sharedBuffer); //worker.js

  self.addEventListener("message",function(e){
    console.log("进入worker线程")
    const sharedArray = new Int32Array(e.data);
    for(var i=0;i<1000000000;i++){}
    console.log("耗时执行结束,唤醒worker2线程")
    Atomics.wake(sharedArray,1,3);
  });

  // worker2.js

  

  self.addEventListener("message",function(e){
    console.log("进入worker2线程")
    const sharedArray = new Int32Array(e.data);
    console.log("worker2唤醒之前我可以多一点事情...")
    Atomics.wait(sharedArray,1,123);
    console.log("worker2线程被唤醒")
  })

结果如下:

补充下 原子操作不可逆也就是不能中断 ;

推荐个Dr. Axel Rauschmayer大神的Exploring ES2016 and ES2017一书 连接在这

环境问题.  

  1.共享内存 chrome 58.0+ 并启用 SharedArrayBuffer 支持

  2. babel-preset-es2017[ 不支持cnpm ] 传送门 + webpack;  

es2017新特性的更多相关文章

  1. es6/es7/es8常用新特性总结(超实用)

    本文标题有误导性,因为我其实想写node8的新特性,说实话一下子从node v1.x跳跃到node 8.x+ 真有点受宠若惊的感觉.一直觉得node 数组. 对象.序列等的处理没有python方便,因 ...

  2. ES9新特性

    这篇文章主要介绍ES2018(ES9)的新特性, 以及使用方法 JS是一门跨平台的语言, ES6也就是ECMAScript 2015 花费了5年的时间敲定, 是一次非常大的改版, 之后每年都有一个小版 ...

  3. C# 各版本新特性

    C# 2.0 泛型(Generics) 泛型是CLR 2.0中引入的最重要的新特性,使得可以在类.方法中对使用的类型进行参数化. 例如,这里定义了一个泛型类: class MyCollection&l ...

  4. ES6的新特性(1)——ES6 的概述

    ES6 的概述 首先,感谢马伦老师的ES6新特性的教程. ECMAScript 和 JavaScript 的关系是 ECMAScript 和 JavaScript 的关系是,前者是后者的规格,后者是前 ...

  5. 细解JavaScript ES7 ES8 ES9 新特性

    题记:本文提供了一个在线PPT版本,方便您浏览 细解JAVASCRIPT ES7 ES8 ES9 新特性 在线PPT ver 本文的大部分内容译自作者Axel Rauschmayer博士的网站,想了解 ...

  6. Vue.js源码中大量采用的ES6新特性介绍:模块、let、const

    1 关于ES6      ECMAScript6(以下简称ES6)是JavaScript语言的最新一代标准,发布于2015年6月,因为ECMA委员会决定从ES6起每年更新一次标准,因此ES6被改名为E ...

  7. 前端知识总结--ES6新特性

    ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在 2015 年 6 月正式发布了.它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应 ...

  8. 从 ES6 到 ES10 的新特性万字大总结

    以下文章来源于鱼头的Web海洋 ,作者陈大鱼头   鱼头的Web海洋 一个名为Web的海洋世界 (给前端大全加星标,提升前端技能) 作者:鱼头的Web海洋 公号 / 陈大鱼头 (本文来自作者投稿) 介 ...

  9. 7 个令人兴奋的 JavaScript 新特性

    前言 一个ECMAScript标准的制作过程,包含了Stage 0到Stage 4五个阶段,每个阶段提交至下一阶段都需要TC39审批通过.本文介绍这些新特性处于Stage 3或者Stage 4阶段,这 ...

随机推荐

  1. cfile fopen fopen_s win10下打开文件失败

    vc程序在win10下面使用fopen 打开文件失败,在网上查 了下是因为UAC权限的问题如下: 由于windows vista win7 win8 win 10 添加了UAC权限,所以会导致 在系统 ...

  2. C#对接JAVA系统遇到的AES加密坑

    起因对接合作伙伴的系统,需要对数据进行AES加密 默认的使用了已经写好的帮助类中加密算法,发现结果不对,各种尝试改变加密模式改变向量等等折腾快一下午.最后网上查了下AES在JAVA里面的实现完整代码如 ...

  3. DOM+position:relative+缓冲运动

    一.nodeType节点类型 nodeType==3  ->文本节点 nodeType==1  ->元素节点 for(var i=0;i<oUl.childNodes.length; ...

  4. 浅谈MyBatisGenerator的使用

    目录 1.概述 2.依赖 3.Maven插件配置 4.配置文件说明 5.运行 6.总结 1.概述 日常中使用MyBatis最为麻烦的就是编写Mapper文件了, 如果数据库增加一张表, 这时通常会复制 ...

  5. 修改git以往历史中所有commit的name和email

    当换了新的电脑设备或者在 homestead 中使用 git 的时候:如果忘了 git config 设置用户名和邮箱:这样当 git commit 的时候就会使用设备名作为 git 用户名:或者我们 ...

  6. 《Android Studio开发实战 从零基础到App上线》资源下载和内容勘误

    转载于:https://blog.csdn.net/aqi00/article/details/73065392 资源下载 下面是<Android Studio开发实战 从零基础到App上线&g ...

  7. JS 正则表达式基本语法(精粹)

    1.正则表达式基本语法 两个特殊的符号'^'和'$'.他们的作用是分别指出一个字符串的开始和结束. 例子如下: "^The":表示所有以"The"开始的字符串( ...

  8. 分布式版本控制系统Git的安装和使用

    作业要求来自https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2097 GitHub远程仓库的地址:https://github.com/ ...

  9. Truthy真值

    在 JavaScript 中,Truthy (真值)指的是在 布尔值 上下文中转换后的值为真的值.所有值都是真值,除非它们被定义为 falsy (即除了 false,0,"",nu ...

  10. html5移动端查找

    用form包裹住input,修改input的类型为seach,然后给input绑定seach事件,当输入状态是输入键盘上会出现搜索,点击搜索就可以查找了 <form action="& ...