ES6概念总结.md

ECMAScript 6

Part1

  • let与const声明变量,
    作用域有所不同
  • 变量解构赋值,
    不规则格式一一智能对应赋值
  • 字符串扩展,
    扩充长度、
    嵌入变量、
    嵌入js表达式、
    嵌入并调用函数返回值、
    标签模板(过滤注入攻击)
  • 正则扩展,
    RegExp对象,
    几种模式匹配(i,g,y,s,)、
    先行断言、
    后行断言
  • 数值扩展,
    数据检测、
    原全局类型转换下挂到Number对象、
    Math对象扩展(判断数值正负整数、对数、三角函数、指数、Integer类型大数值(不能与Number混算))
  • 函数扩展,
    添加函数参数默认值(通过省略参数或者传入undefined触发,定义域与全局平级与函数内部互相独立)、
    ...rest参数、
    箭头函数(没有自己的this==>引用外层的this,函数内使用this不需绑定bind;不能用call()、apply()、bind()这些方法去改变this的指向;不能用yield)、
    尾调用==>优化、
    尾递归==>节省内存(只保留一个调用记录,复杂度 O(1) )、
    使用函数参数默认值实现单参数单帧递归
  • 数组扩展,
    ...运算符,拆解数组==>参数序列(rest的逆运算)、
    Array.from()对象转数组、可遍历对象转数组(迭代器接口、Map、Set)、
    遍历方法 entries()遍历键值对,keys(),values()
  • 对象扩展,
    方法的简写,类似java类声明方法、
    get与set函数、
    对象比较(is)、对象合并(assign,是浅拷贝,对象属性为对象则仅引用对象)、

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
改进之处:

  • 不必再用co模块;调用方法与普通函数相同
  • 语法美观;
  • yield的命令后跟内容,种类比co模块多; 可以是Promise对象(含有异步)和原始类型的值(类似同步)
  • 返回promise对象

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 不会被继承

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,302评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,232评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,337评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,977评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,920评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,194评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,638评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,319评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,455评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,379评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,426评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,106评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,696评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,786评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,996评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,467评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,043评论 2 341

推荐阅读更多精彩内容

  • Promiese 简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果,语法上说,Pr...
    雨飞飞雨阅读 3,348评论 0 19
  • 异步编程对JavaScript语言太重要。Javascript语言的执行环境是“单线程”的,如果没有异步编程,根本...
    呼呼哥阅读 7,291评论 5 22
  • Promise的含义:   Promise是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和...
    呼呼哥阅读 2,158评论 0 16
  • 官方中文版原文链接 感谢社区中各位的大力支持,译者再次奉上一点点福利:阿里云产品券,享受所有官网优惠,并抽取幸运大...
    HetfieldJoe阅读 6,366评论 9 19
  • 弄懂js异步 讲异步之前,我们必须掌握一个基础知识-event-loop。 我们知道JavaScript的一大特点...
    DCbryant阅读 2,690评论 0 5