记一些写代码中用得到的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. Oracle积累

    Oracle积累 1           用To_char()转换带小数的数值. 例如:0.125 取两位小数. To_char(0.125,'FM990.99')   -> 0.13 注: 格 ...

  2. [转]怎么查看和修改 MySQL 的最大连接数?

    使用 MySQL 数据库的站点,当访问连接数过多时,就会出现 "Too many connections" 的错误.出现这种错误有两种情况,一种是网站访问量实在太大,服务器已经负担 ...

  3. 重温MFC

    1. Button控件 2. 旋转和高级编辑控件 3. 标签控件和属性页 4. 列表控件 5. 树控件 6. 进度条控件和滑动条控件 7. 滚动条 8.工具栏和状态栏

  4. python2.7.5 安装pip

    1 先安装setuptools 下载地址:https://pypi.python.org/pypi/setuptools#downloads 将下载后的tar文件解压,用CMD模式进入到解压后的文件所 ...

  5. js实现最短时间走完不同速度的路程

    题目: 现在有一条公路,起点是0公里,终点是100公里.这条公路被划分为N段,每一段有不同的限速.现在他们从A公里处开始,到B公里处结束.请帮他们计算在不超过限速的情况下,最少需要多少时间完成这段路程 ...

  6. SVN错误:Attempted to lock an already-locked dir的解决

    问题: SVN locked,文件被锁无法更新,SVN上更新代码失败,某些文件提示错误:Attempted to lock an already-locked dir 解决方法: 右键具体文件→Tea ...

  7. Android 使用EventBus发送消息接收消息

    基本使用 自定义一个类 public class LoginEvent { private String code;//是否成功 public LoginEvent(String code) { th ...

  8. Unity AssetBundle 游戏资源分类及关系

    --刚刚做完一个xlua的的热更项目,对AssetBundle资源分类总结一下.纯理论,闲谈知识,要是有建议,尽管提 ,不掺杂代码. --这里说说,AB是如何打包,如果下载,如何加载. 1.关键词理解 ...

  9. 【转】判断点在多边形内(matlab)

    inpolygon -Points inside polygonal region Syntax IN = inpolygon(X,Y,xv,yv)[IN ON] = inpolygon(X,Y,xv ...

  10. 【转】GPS连续运行单参考站解决方案

    GPS连续运行单参考站解决方案   一.  前言 随着国家信息化程度的提高及计算机网络和通信技术的飞速发展,电子政务.电子商务.数字城市.数字省区和数字地球的工程化和现实化,需要采集多种实时地理 空间 ...