记一些写代码中用得到的es6+语法,至于什么正则的拓展,数组的什么fill方法,对我们来说用处不大,就不提及了。

还有es6的import模块和class模块,这些在各种框架中都有体现,而且语法简单,也不提及。仅写一下对当前项目的影响。

let/const

var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 10

导致了typeof再也不是完全安全的操作了

typeof a;
let a; // error

块级作用域以后就不需要自执行函数了

// IIFE 写法
(function () {
var tmp = ...;
...
}()); // 块级作用域写法
{
let tmp = ...;
...
}

解构赋值

let [a, b, c] = [1, 2, 3];
相当于
var _a = [1, 2, 3], a = _a[0], b = _a[1], c = _a[2]; var {x, y = 5} = {x: 1};
x // 1
y // 5 function add([x, y]){
return x + y;
} add([1, 2]); // 3 let { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 };
x // 1
y // 2
z // { a: 3, b: 4 }

函数的拓展

  • 参数默认值
  • rest 参数
function add(...values) {
let sum = 0;
// values = [2,5,3];
for (var val of values) {
sum += val;
} return sum;
} add(2, 5, 3) // 10
  • 箭头函数
var f = v => v;
相当于
var f = function(v) {
return v;
}; var f = v => (a) => "c";
相当于
var f = function (v) {
return function (a) {
return "c";
};
}; var f = v => console.log(v);
var f = v => {console.log(v)};
var f = v => { return console.log(v)};// 这3种方式有什么区别?

对象拓展

Object.assign

const target = { a: 1 };

const source1 = { b: 2 };
const source2 = { c: 3 }; Object.assign(target, source1, source2);
target // {a:1, b:2, c:3} => function extend(obj, ext) { // 用assign写$.extend
return Object.assign({}, obj, ext);
}

generator

  • Generator 函数是 ES6 提供的一种异步编程解决方案。
  • 执行 Generator 函数会返回一个遍历器对象
function* helloWorldGenerator() {
yield 'hello';
yield 'world';
return 'ending';
} var hw = helloWorldGenerator();
hw.next()
// { value: 'hello', done: false }
hw.next()
// { value: 'world', done: false }
hw.next()
// { value: 'ending', done: true }
hw.next()
// { value: undefined, done: true }

用for of循环遍历

for (let v of hw){
console.log(v);
}
// hello world

generator函数的yield没有返回,next方法可以带一个参数,该参数就会被当作上一个yield表达式的返回值。

function* helloWorldGenerator() {
console.log('Hello' + (yield 123));
yield 'world';
return 'ending';
} var hw = helloWorldGenerator();
console.log( hw.next('1'));// 第一个next的参数是没用的,因为没有上一个yield
console.log( hw.next('2')); // { value: 123, done: false }
// Hello2
//{ value: 'world', done: false }

因为都是iterator遍历器对象,所以基于for of的解构赋值也能用,但是return的done状态是true,所以下面这段代码ending为undefined

function* helloWorldGenerator() {
yield 'hello'
yield 'world';
return 'ending';
} var hw = helloWorldGenerator();
let [hello,world,ending ] = hw;
console.log(hello,world,ending );

也可以函数外return,参数为其value

function* helloWorldGenerator() {
yield 'hello'
yield 'world';
return 'ending';
} var hw = helloWorldGenerator();
console.log( hw.return('a'));// { value: 'a', done: true }

而且

function* bar() {
yield 'x';
yield* foo();
yield 'y';
}
===
function* bar() {
yield 'x';
for (let v of foo()) {
yield v;
}
yield 'y';
}

给object添加iterator接口,使其能够被for of遍历出来:

var obj = {
a:1,b:2,c:3,d:4
};
obj[Symbol.iterator] = () => {
var keys = Object.keys(obj);
var current = 0;
return {
next: function () {
var res = {
value: obj[keys[current]],
done: keys[current] ?false:true
};
console.log(res)
current++;
return res;
}
};
};
for (let v of obj){
console.log(v);
}
思考一下,怎么把iterator函数里的obj换成this?

那么如何完成这个操作:

function* a(){
yield "a";
}
function* b(){
yield a();
}
b()______;
//填什么得到a()中的“a”?

es8的主要特性

其中js的多线程阿,共享内存对我们影响不大,但是还是稍微提及一下,主要影响就是async函数了

async

  • 是 Generator 函数的语法糖。
  • 内置执行器
  • 要求await后面是promise
  • 语义性好
async function main() {
try {
const val1 = await a();
const val2 = await b(val1);
const val3 = await c(val1, val2); console.log('Final: ', val3);
}
catch (err) {
console.error(err);
}
}

a,b,c是3个异步操作,这样会顺序执行,a,b,c。如果希望abc同时执行也可以写为:

// 写法一
let [foo, bar] = await Promise.all([a(), b(), c()]); // 写法二
let aP = a();
let bP = b();
let cP = c();
let foo = await aP;
let bar = await bp;
let res = await cP;
function PromiseFactory(delay){
return (name) => new Promise((rs,rj) => {
setTimeout(()=>{
console.log(delay,'over');
rs(name);
},delay)
})
}
var a = PromiseFactory(1000);
var b = PromiseFactory(2000);
var c = PromiseFactory(3000);
async function gen(){
let aP = a('a');
let bP = b('b');
let cP = c('c');
let foo = await aP;
let bar = await bP;
let res = await cP;
return console.log(foo,bar, res);
}
gen();

共享内存和Atomics

此功能引入了一个新的低级别Atomics命名空间对象和一个SharedArrayBuffer构造函数,来作为更高级别并发抽象的原始构建块。

  • 这使开发人员能够共享多个service worker和核心线程之间的SharedArrayBuffer对象的数据。
  • 这种引入带来了巨大的益处,因为可以更轻松地在worker之间共享数据,从而可以改善worker之间的协调。

Atomics

当内存共享时,内存中的数据块可能被多个线程同时读写。Atomic 操作保障了数据读写符合预期,即下一个操作一定会在上一个操作结束后才开始,操作也不会被中断。

  1. Atomics.add() // 将数组指定位置上的值加上一个给定值。返回这个位置上的旧值。
  2. Atomics.and() // 对数组指定位置上的值进行位与操作。返回这个位置上的旧值。
  3. Atomics.compareExchange() // 如果数组中特定位置的值与给定的值相等,则更新为另一个指定的值。返回这个位置上的旧值
  4. Atomics.store() // 将给定值存在数组的指定位置。返回这个“给定值”。
  5. ...

SharedArrayBuffer

对象用来表示一个泛型的,固定长度的原生二进制数据缓冲区,类似于 ArrayBuffer 对象。但在某种程度上,它们能被用于在共享内存上创建视图。与 ArrayBuffer 不同的是,SharedArrayBuffer 不能被移除。

  • new SharedArrayBuffer(length)

字符串填充

padStart 和 padEnd 。正如其名,这俩函数的作用就是在字符串的头部和尾部增加新的字符串,并且返回一个具有指定长度的新的符串。

'es8'.padStart(2);          // 'es8'
'es8'.padStart(5); // ' es8'
'es8'.padStart(6, 'woof'); // 'wooes8' 'es8'.padEnd(2); // 'es8'
'es8'.padEnd(5); // 'es8 '
'es8'.padEnd(6, 'woof'); // 'es8woo'

Object values和entries函数

Object.values类似Object.keys的返回。

const obj = { x: 'xxx', y: 1 };
Object.values(obj); // ['xxx', 1] const obj = ['e', 's', '8']; // same as { 0: 'e', 1: 's', 2: '8' };
Object.values(obj); // ['e', 's', '8']

Object.entries

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']]

getOwnPropertyDescriptors

const obj = {
get es7() { return 777; },
get es8() { return 888; }
};
Object.getOwnPropertyDescriptor(obj);
// {
// es7: {
// configurable: true,
// enumerable: true,
// get: function es7(){}, //the getter function
// set: undefined
// },
// es8: {
// configurable: true,
// enumerable: true,
// get: function es8(){}, //the getter function
// set: undefined
// }
// }

结尾逗号

function es8(var1, var2, var3,) {
// ...
}
es8(10, 20, 30,);

es2015及es2017对我们的编程方式造成了什么影响?的更多相关文章

  1. ASP.NET MVC下的四种验证编程方式[续篇]

    在<ASP.NET MVC下的四种验证编程方式>一文中我们介绍了ASP.NET MVC支持的四种服务端验证的编程方式("手工验证"."标注Validation ...

  2. ASP.NET MVC下的四种验证编程方式

    ASP.NET MVC采用Model绑定为目标Action生成了相应的参数列表,但是在真正执行目标Action方法之前,还需要对绑定的参数实施验证以确保其有效性,我们将针对参数的验证成为Model绑定 ...

  3. [转]Windows网络编程学习-面向连接的编程方式

    直接附上原文链接:windows 网络编程学习-面向连接的编程方式

  4. C#通过编程方式实现Ping

    代码是照着书敲的,贴出来方便平时参考 using System; using System.Collections.Generic; using System.Linq; using System.T ...

  5. ASP.NET MVC下的四种验证编程方式[续篇]【转】

    在<ASP.NET MVC下的四种验证编程方式> 一文中我们介绍了ASP.NET MVC支持的四种服务端验证的编程方式(“手工验证”.“标注ValidationAttribute特性”.“ ...

  6. ASP.NET MVC下的四种验证编程方式【转】

    ASP.NET MVC采用Model绑定为目标Action生成了相应的参数列表,但是在真正执行目标Action方法之前,还需要对绑定的参数实施验证以确保其有效 性,我们将针对参数的验证成为Model绑 ...

  7. WCF编程系列(六)以编程方式配置终结点

    WCF编程系列(六)以编程方式配置终结点   示例一中我们的宿主程序非常简单:只是简单的实例化了一个ServiceHost对象,然后调用open方法来启动服务.而关于终结点的配置我们都是通过配置文件来 ...

  8. CodeFirst 的编程方式

    第一步:创建控制台项目第二步:添加新建项目→Ado.Net空实体模型第三步:添加实体:Customer,添加几个必要的测试字段第四步:添加实体之间的联系第五步:根据模型生成数据库脚本,并执行sql脚本 ...

  9. uglifyjs压缩js文件(指令压缩/ 批量压缩/ 编程方式压缩)

    一.指令压缩 1.安装node,npm——详细见nodejs安装与使用入门 2.安装 uglifyjs——npm install -g uglify-js 3.压缩例子:1)uglifyjs  mai ...

随机推荐

  1. Go语言是我见过最简洁的语言(除了lua)

    写在前面:题目就是个标题党,在这里先道歉,其次撸主学过很多语言(基本上是个语言都要上一下的那种人,但是不会太深入,只做了解,因为很多用不到),但主要使用C#语言(不过已经开始恶心C#的臃肿,不要打我) ...

  2. NumPy-矩阵部分

    NumPy-矩阵部分 [TOC] NumPy 简介 numpy可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多. 安装NumPy pi ...

  3. Centos7-安装telnet服务

    1,检查是否安装 telnet-server和xinetd rpm -qa telnet-server rpm -qa xinetd 2,如果没有安装过就安装 查找yum yum list |grep ...

  4. Linux指令--watch,at

    watch是一个非常实用的命令,基本所有的Linux发行版都带有这个小工具,如同名字一样,watch可以帮你监测一个命令的运行结果,省得你一遍遍的手动运行.在Linux下,watch是周期性的执行下个 ...

  5. Linux指令--head,tail

    原文出处:http://www.cnblogs.com/peida/archive/2012/11/06/2756278.html head 与 tail 就像它的名字一样的浅显易懂,它是用来显示开头 ...

  6. JAVA中比较两个文件夹不同的方法

    JAVA中比较两个文件夹不同的方法,可以通过两步来完成,首先遍历获取到文件夹下的所有文件夹和文件,再通过文件路径和文件的MD5值来判断文件的异同.具体例子如下: public class TestFo ...

  7. android在一个应用程序员启动另一个程序

    一般我们知道了另一个应用的包名和MainActivity的名字之后便可以直接通过如下代码来启动: Intent intent = new Intent(Intent.ACTION_MAIN); int ...

  8. 合理使用软引用和弱引用,提升JVM内存使用性能

    在项目运行时,OOM异常是比较处理的,因为从日志看出的发生异常的代码点可能仅仅是最后一根稻草,从中可能未必能发现OOM的原因,而且OOM未必是固定重现的. 上医治未病,与其等OOM问题发生时再通过看日 ...

  9. 【转】GPS静态观测网的设计指标

     GPS网的设计指标是指导GPS网设计量化因子,是评价GPS网设计优劣的数值标准.评价GPS网设计的优劣主要从以下三个因素考虑:1.质量(包括精度和可靠性):2.效率:3.费用. 一.GPS网设计的精 ...

  10. python简单分布式demo

    A服务器是master,B服务器为worker, A服务器上执行taskManger.py # coding:utf-8 import random,time,Queue from multiproc ...