ES6允许按照一定模式从数组和对象中提取值,对变量进行赋值
ES6引入新的声明字符串的方式 [``]
ES6允许在大括号里面,直接写入变量和函数,作为对象的属性和方法。
...rest
参数代替(但如果箭头函数的 this如果指向普通函数,它的 argumens 继承于该普通函数)
具有默认值的参数,一般位置要靠后(潜规则)
如果不传c这个参数,且不给c赋初始值,c就是NaN。
用于获取函数的实参,用来代替arguments
扩展运算符能将【数组】转化为逗号分隔的【参数序列】
rest参数是将其放在函数声明的形参位置上,而扩展运算符是放在函数调用的实参上
ES6引入了一种新的原始数据类型Symbol,表示独一无二的值,是一种类似于字符串的数据类型
使用Symbol.for创建可以通过描述字符串得到唯一的symbol值
给对象添加属性和方法,表示独一无二的。
以下这种方法也可以,但是有一定的风险,我们不知道game对象中有没有up,有没有down;所以需要判断,就增加了复杂度
使用symbol:安全,高效
迭代器是一个接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署Iterator接口(js中Iterator接口其实就是对象的属性:symbol.iterator),都可以完成遍历操作。
生成器函数是ES6提供的一种异步编程解决方案,语法行为和传统函数不同
ES6之前:纯回调函数
Promise是ES6引入的异步编程的解决方案。语法上Promise是一个构造函数,用来封装异步操作并可以获取其成功或失败的结果。
一个 Promise对象有以下三种状态:
Promise接受一个参数,该参数为一个函数类型的值,该函数有两个形参:resolve,reject。分别表示异步操作执行成功后的回调函数和异步操作执行失败后的回调函数;resolve是将Promise的状态置为fullfiled,reject是将Promise的状态置为rejected
传入的是一个匿名函数,因此会立即执行。所以我们用Promise的时候一般是包在一个函数中,在需要的时候去运行这个函数,如:
执行这个函数我们得到了一个Promise对象,这个对象上有then、catch方法。then 表示异步成功执行后的数据状态变为reslove ;catch 表示异步失败后执行的数据状态变为reject 。all表示把多个没有关系的Promise封装成一个Promise对象使用then返回一个数组数据
因此,.then里面的函数就跟我们平时的回调函数是一个意思,能够在runAsync这个异步任务执行完成之后被执行。
下面是回调函数的写法:
如果有多层回调,比如callback也是一个异步操作,而且执行完后也需要有相应的回调函数,这样就势必会造成回调地狱。
这样能够按顺序,每隔两秒输出每个异步回调中的内容,在runAsync2中传给resolve的数据,能在接下来的then方法中拿到。运行结果如下:
相对应的回调函数的写法:
reject的作用就是把Promise的状态置为rejected,这样我们在then中就能捕捉到,然后执行“失败”情况的回调
getNumber函数用来异步获取一个数字,2秒后执行完成,如果数字小于等于5,我们认为是“成功”了,调用resolve修改Promise的状态。否则我们认为是“失败”了,调用reject并传递一个参数,作为失败的原因。
它和then的第二个参数一样,用来指定reject的回调,用法是这样:
效果和写在then的第二个参数里面一样。不过它还有另外一个作用:在执行resolve的回调(也就是上面then中的第一个参数)时,如果抛出异常了(代码出错了),那么并不会报错卡死js,而是会进到这个catch方法中。请看下面的代码:
在resolve的回调中,我们console.log(somedata);而somedata这个变量是没有被定义的。如果我们不用Promise,代码运行到这里就直接在控制台报错了,不往下运行了。但是在这里,会得到这样的结果:
也就是说进到catch方法里面去了,而且把错误原因传到了reason参数中。即便是有错误的代码也不会报错了,这与我们的try/catch语句有相同的功能。
Promise的all方法提供了并行执行异步操作的能力,并且在所有异步操作执行完后才执行回调。
用Promise.all来执行,all接收一个数组参数,里面的值最终都返回Promise对象。这样,三个异步操作的并行执行的,等到它们都执行完后才会进到then里面。那么,三个异步操作返回的数据哪里去了呢?都在then里面呢,all会把所有异步操作的结果放进一个数组中传给then,就是上面的results。所以上面代码的输出结果就是
有了all,你就可以并行执行多个异步操作,并且在一个回调中处理所有的返回数据
all方法的效果实际上是谁跑的慢,以谁为准执行回调,那么race方法谁跑的快,以谁为准执行回调;我们把上面runAsync1的延时改为1秒来看一下
1秒后runAsync1已经执行完了,此时then里面的就执行了
在then里面的回调开始执行时,runAsync2()和runAsync3()并没有停止,仍旧再执行。于是再过1秒后,输出了他们结束的标志。
用race给某个异步请求设置超时时间,并且在超时后执行相应的操作
requestImg函数会异步请求一张图片,我把地址写为"xxxxxx",所以肯定是无法成功请求到的。timeout函数是一个延时5秒的异步操作。我们把这两个返回Promise对象的函数放进race,于是他俩就会赛跑,如果5秒之内图片请求成功了,那么遍进入then方法,执行正常的流程。如果5秒钟图片还未成功返回,那么timeout就跑赢了,则进入catch,报出“图片请求超时”的信息。运行结果如下:
上述代码可以.then方法返回一个promise对象,但是这个promise的状态是由回调函数的执行结果来决定的
then方法在指定回调的时候是可以只指定一个的
ES6 提供了新的数据结构 Set(集合)。它类似于数组,但成员的值都是唯一的,集合实现了 iterator
接口,所以可以使用『扩展运算符』和『for…of…』进行遍历,集合的属性和方法:
ES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合。但是“键”的范围不限于字符串,各种类
型的值(包括对象)都可以当作键。Map 也实现了iterator 接口,所以可以使用『扩展运算符』和
『for…of…』进行遍历;
ES6 提供了更接近传统语言的写法,引入了 Class(类)这个概念,作为对象的模板。通过 class 关键
字,可以定义类。基本上,ES6 的 class 可以看作只是一个语法糖,它的绝大部分功能,ES5 都可以做
到,新的 class 写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已;
ES6之后通过类名来实例化对象
从上述例子中可以看出实例对象是没有构造函数对象上的属性,也没有构造函数上的方法.因此函数对象是函数对象,实例对象是实例对象
那么,实例对象上的属性跟什么是相同的呢?
实例对象上的属性跟构造函数上的原型对象是相同的。
上面中的name,change属于构造函数这个对象.并不属于实例对象。在面向对象中这样的属性就称为 静态属性
而类似的在类中,某些属性属于类而不属于实例对象就称为class的静态成员。
ES5中使用构造函数继承
在子类中声明一个同父类同名的方法,即重写
这个时候子类是不可以调用父类的同名call方法
输出的是price这个函数
set:对属性进行赋值
模块化是指将一个大的程序文件,拆分成许多小的文件,然后将小文件组合起来;
模块化的优势有以下几点:
ES6 之前的模块化规范有:
模块功能主要由两个命令构成:export 和 import;