前端社团程序员技术干货

ES6概念总结.md

2017-07-06  本文已影响37人  ccminn

ECMAScript 6

Part1

Part2

Set与Map

Set:无序元素,元素不能重复,遍历顺序就是插入顺序,查找效率更高,而Array元素可重复;
weakSet:weakSet的成员只能是对象;引用对象在外部消失,它在 WeakMap 里面的引用就会自动消失 ==> 释放内存;
Map:值值对;与对象的区别就是,可以用对象、数组作为键名;遍历顺序就是插入顺序;
weakMap: 只接受对象作为键名;键名所引用的对象都是弱引用,即垃圾回收机制不将该引用考虑在内。因此,只要所引用的对象的其他引用都被清除,垃圾回收机制就会释放该对象所占用的内存。

垃圾回收机制

垃圾回收机制依赖引用计数,如果一个值的引用次数不为0,垃圾回收机制就不会释放这块内存。对于那些不重要的引用,在结束使用之后,有时会忘记取消引用,导致内存无法释放,进而可能会引发内存泄漏。


Proxy

var proxy = new Proxy(所要拦截的目标对象target, 定制拦截行为handler);
对目标对象,设置一个隔离层,经过proxy-handler验证才能实现对应操作。
Proxy.revocable方法返回一个可取消的 Proxy 实例。回收代理权,不允许再次访问;
设置了proxy代理的对象,在proxy内部的this都指向proxy,而不是target;需要使用bind(target);


Reflect

Reflect对象存放语言内部方法;
让Object命令式操作都变成函数行为,封装命令;
实现观察者模式==>监听;


Promise

promise

是异步操作的预定义,预定义了成功(Resovled)与失败(Rejected)的后续执行内容。使多层嵌套的回调函数能够有美观的格式,形同同步执行,实为异步执行。

var p1 = new Promise(function (resolve, reject) {
  // ...
});

var p2 = new Promise(function (resolve, reject) {
  // ...
  resolve(p1);     // 返回另一个异步操作
})

上面代码中,p1和p2都是Promise的实例,但是p2的resolve方法将p1作为参数,即一个异步操作的结果是返回另一个异步操作。

注意,这时p1的状态就会传递给p2,也就是说,p1的状态决定了p2的状态。如果p1的状态是Pending,那么p2的回调函数就会等待p1的状态改变;如果p1的状态已经是Resolved或者Rejected,那么p2的回调函数将会立刻执行。

promise

Promise.all方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。

var p = Promise.all([p1, p2, p3]);

p的状态由p1、p2、p3决定,分成两种情况。

(1)只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。

(2)任何一个被rejected,p的状态就变成rejected,返回第一个被reject的实例的返回值;

promise.resolve

Promise.resolve() 将现有对象转为Promise对象

有效的自定义方法
done

提供一个处于回调链的尾端的done方法,保证在then或catch中的跑出的错误都能被接到;

finally

无论Promise对象最后状态如何,是resolved还是rejected,都会执行的一个操作(eg.运行结束前关闭服务器)。

promise.try 处理异常

iterator 迭代器

通过Symbol.iterator对数据结构进行有序遍历

generator 生成器

具有状态的函数;拥有众多返回值;实际使用与iterator结合
function* foo(x, y) { ··· }


async 是generator函数定义的语法糖,封装了generator函数与自动执行器

Generator 函数的星号(*)替换成async;
将yield替换成await
改进之处:

async 标识符定义generator函数,即async函数,使用await表示调用内含异步操作的函数;调用这个async函数,立即就会返回一个promise对象(本身写了return Promise就返回这个promise;不然就把函数语句封装成一个promise),在promise对象获得resolve指令之后,才继续执行await语句的下一个语句;如果promise变为reject,则整个async函数就中断执行

async函数的使用:可以后接then(),async函数的内部return值会成为then方法的回调函数参数
为了使async函数中的多个await,在前几个await出错变为reject的情况下,仍能执行,把会出错的await放进try...catch块中,接住错误即可;

let foo = await getFoo();
let bar = await getBar();


两个独立的一步操作,按照上述写法会造成阻塞;改为同时触发写法

// 写法一   并发执行
let [foo, bar] = await Promise.all([getFoo(), getBar()]);

// 写法二
let fooPromise = getFoo();
let barPromise = getBar();
let foo = await fooPromise;
let bar = await barPromise;
async的异步遍历器

Symbol.asyncIterator属性,在调用next方法时,返回promise对象;因此.next()可以链式调用.then();
Symbol.iterator属性,在调用next方法是,返回yield对象;

异步generator函数

异步 Generator 函数,执行后返回一个异步 Iterator 对象。对该对象调用next方法,返回一个 Promise 对象。

async function* gen() {
  yield 'hello';
}
const genObj = gen();     // genObj是一个异步迭代器对象;  
genObj.next().then(x => console.log(x));     // next()返回Promise对象,可后跟then或catch 
// { value: 'hello', done: false }


class

class 是 对象的更符合程序设计的写法;本质上并没有区别
类的所有方法都定义在类的prototype属性上面。

class B {}
let b = new B();
b.constructor === B.prototype.constructor // true

静态方法 static 不会被继承
静态属性 static 不会被继承

上一篇下一篇

猜你喜欢

热点阅读