ES6

let关键字
用来定义块作用域变量的
	var定义函数级作用域变量
		在函数内部定义的变量,外部无法访问
		在代码块(if, for等)中定义的变量,外部可以访问
	let定义块作用域变量的:
		在函数内部定义的变量,外部无法访问,
		在代码块(if, for等)中定义的变量,外部仍然无法访问
let与var比较
作用域				  var函数级作用域			    let块级作用域
重复定义			 var可以重复定义变量		  let不可以重复定义变量
声明前置			 var支持声明前置			   let不支持声明前置
for循环中存储数据	   var不能存储数据			 let可以存储数据
被window挂载	      var可以被挂载				let不能被挂载
const关键字
const关键字是用来定义常量(一旦定义无法改变的变量,通常是表示一些固定不变的数据)
	使用const关键字的特点:
		1 无法被修改
		2 支持块作用域(只能在代码块里面访问)
		3 无法重复定义
		4 无法声明前置
		5 不能被window挂载
		6 不能作为for循环体中的变量使用
		7 值只能是值类型,如果是引用类型则可以被修改
	通常是用大写字母表示,并且横线分割单词,常用于定义配置量

const对应的对象属性是否可以修改

字符串扩展–多行字符串
单行字符串:由一组单引号或者双引号定义的字符串
	单行字符串的问题:1 单行字符串不能换行。2 一些特殊的案件要使用转义字符\n。3 一些特殊的字符要使用转义符\x20 4 字符串标志符号不能直接嵌套,单引号中不能直接写单引号,要转义\',双引号中不能直接写双引号,要转义\"

ES6为了解决单行字符串中的问题,提供了多行字符串
	通过 ` 定义,在多行字符串中,只有`需要转义\`,其它的字符,都可以直接书写
	并且ES6多行字符串支持插值语法:${key}
	${}提供了js环境,因此我们可以写js表达式
	ES6的插值语法,让其它框架的插值语法的重要性,大打折扣
字符串扩展–原始字符串
在使用了转义字符之后,并且在浏览器查看的时候,我们只能看到结果,不能看到原始完整的字符串(包含转义符),于是ES6中扩展了String.raw方法用于,查看完整的原始字符串
	使用方式
		String.raw``
	参数通过多行字符串的形式传递,字符串中的转义字符不会被转义
字符串扩展–重复字符串
ES6中拓展了repeat方法用于重复输出字符串
	参数就是要重复的次数
	返回值就是重复的结果	
对原始字符串没有影响
	
let str = 'hello ||';
console.log(str.repeat(3));
字符串拓展–判断字符串的位置
startsWith(str, pos)	是否以参数字符串开头
	截取后面的部分,并且包含截取位置字符
	str	参数字符串(子字符串)
	pos 字符串截取位置
	返回值都是布尔值

endsWith(str, pos)		是否以参数字符串结尾
	截取前面的部分,并且不包含截取位置字符

includes(str, pos)		是否包含参数字符串
	截取后面的部分,并且包含截取位置字符
	


let str = '判断字符串的位置';
// 是否以参数字符串开头,截取后面的部分,并且包含截取位置字符
console.log(str.startsWith('判断', 0));
// 是否以参数字符串结尾,截取前面的部分,并且不包含截取位置字符
console.log(str.endsWith('位置', 8));
// 是否包含参数字符串,截取后面的部分,并且包含截取位置字符     
console.log(str.includes('位置', 0));
数字拓展–isNaN
ES6为数字扩展了几个方法:isNaN, isFinite, isInteger
全局中有一个isNaN方法,是用于判断是否是NaN(not a Number)
	全局中isNaN在判断的时候,会进行类型转换
	而Number拓展的isNaN,在判断的时候不会做类型转换
		首先必须是数字
		其次才去判断是否是NaN
			如果是NaN,则返回true
			如果不是NaN,则返回false

全局中有一个isFinite方法,是用于判断是否是有限的
	全局中isFinite在判断的时候,会进行类型转换
	而Number拓展的isFinite,在判断的时候不会做类型转换
		首先必须是数字
		其次才去判断是否是有限的
			如果是有限的,则返回true
			如果不是有限的,则返回false

Number拓展的isInteger方法,用于判断是否是整型的
	在判断的过程中,会校验类型
		首先必须是数字
		其次才去判断是否是整型的
			如果是整型,则返回true
			如果不是整型,则返回false
数学对象拓展
就是对Math对象的拓展
ES6为了适应大型项目,解决自身运算的问题,拓展了大量的方法
	Math.cbrt:计算一个数的立方根
	Math.fround:返回一个数的单精度浮点数形式
	Math.hypot:返回所有参数的平方和的平方根
	Math.expm1(x):返回ex-1
	Math.log1p(x):返回1 + x 的自然对数。如果x小于-1,返回NaN
	Math.log10(x):返回以10为底的x的对数,如果x小于0,则返回NaN
	Math.log2(x):返回以2为底的x的对数,如果x小于0,则返回NaN
对象拓展–对象字面量
对象字面量:let obj = {}
省略语法:
	1 如果定义的属性名称与属性值变量同名,我们可以省略属性名称以及冒号
	2 可以对属性名称书写表达式,通过[]动态的设置属性名称
		之前可以通过[]来获取属性,现在我们可以通过[]来设置属性名
	3 在对象中定义方法可以省略冒号以及function


let color = 'red';
let obj = {
    // color: color
    // 1 如果定义的属性名称与属性值变量同名,我们可以省略属性名称以及冒号
    color,
    // 2 可以对属性名称书写表达式,通过[]动态的设置属性名称
    [color]: 200,
    // []提供了js环境,可以书写复杂的表达式
    [color.toUpperCase() + '_hello']: 200,
    // 定义方法
    // getColor: function() {
    //     return this.color;
    // }
    // 3 ES6在对象中定义方法可以省略冒号以及function
    getColor() {
    	return this.color;
    }
}
对象扩展–is
is方法用于判断两个参数是否全等(===)
全等判断有几个问题:
	1、0 -0之前在进行全等判断的时候,得到的是true
		0和-0之间是差了一个符号位,在二进制中,存储的数据是不同的
	2、NaN和NaN在进行全等判断的时候,得到的是false
		所有NaN都表示“不是一个数字”,他们存储的地址是一样
对象拓展的is方法:
	在判断0和-0的时候,得到false
	在判断NaN的时候,得到的是true
除此之外,is方法和全等符号是一致的


console.log(Object.is(0 / 1, 0 / -1));      // false
console.log(Object.is(NaN, +'abc'));        // true
// 除此之外,is方法和全等符号(===)是一致的
对象拓展–assign
ES6拓展的assign是用于复制对象的
	使用方式:Object.assign(obj, obj1, obj2)
		obj:被复制的目标对象	从第二个参数开始,都是复制的对象	返回值是目标对象obj
	注意:后面对象中的同名属性会覆盖前面对象中的属性
assign方法实现的是一个浅复制
	浅复制:值类型是直接复制,而引用类型是改变指向,没有真正的复制
	深复制:值类型是直接复制,引用类型也是直接复制,并不是改变指向(函数除外)
		简单实现深复制:JSON.parse(JSON.stringify),但是转换json字符串的时候,会过滤掉函数

数组拓展–from
from方法是用于遍历类数组对象,或将类数组对象转换成数组,是数组的静态方法
	类数组对象:可以通过索引值获取属性值,并且要具备length属性的一类对象
类数组对象不能使用数组的遍历器方法,ES6中拓展的from方法可以将类数组转为真正的数组,之后就可以使用数组的常用方法
	使用方式:Array.from(arrLike, fn)
		arrLike:类数组对象
		fn:执行的函数,有两个参数:成员值、索引值。this默认指向window
		如果传递的fn参数,此时,from方法的返回值是函数的执行结果
总结:from方法不仅可以将类数组转为数组,还可以遍历类数组对象
数组拓展–of
of方法用于创建数组的,是数组的一个静态方法
	之前通过new Array()或者Array()创建数组有一些问题:
		1 如果没有传递参数,得到的是一个空数组
		2 如果传递了一个数字参数,得到的是带有一个长度的空数组
		3 如果传递一个非数字参数,得到的是带有一个成员的数组
		4 如果传递了多个参数,得到的是一个带有多个参数的数组
ES6中拓展的of方法可以实现将所有传递的参数都作为数组中的成员存在
创建数组的四种方式
	字面量[]	构造函数new Array()		工厂方法Array()		Array.of()
数组拓展–查找数组
在ES5中拓展了查找成员的方法:indexOf, lastIndexOf
在ES6中拓展了查找成员的方法:find, findIndex
	参数就是执行的函数
		函数中有三个参数:成员值、索引值、原数组
		this默认指向window
find方法在查找成员的时候,如果找到了则返回该成员,如果没有找到则返回undefined
findIndex方法在查找成员的时候,如果找到了则返回该成员的索引值,如果没有找到返回-1
在查找的过程中,一旦找到则停止遍历
数组拓展–数组内部复制
ES6为了实现数组内部复制成员提供了一个方法:copyWithin
使用方式:
	arr.copyWithin(pos, start, end)
		pos:要粘贴的位置
		start:要复制的起始位置(包含起始位置)
		end:要复制的结束位置(不包含结束位置)
		返回值就是原数组,并且原数组发生变化
例如:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9].copyWithin(3, 6, 9)
结果:[0, 1, 2, 6, 7, 8, 6, 7, 8, 9]
数组扩展–迭代器方法
ES6中为了遍历数组中成员,拓展了三个迭代器方法:keys, values, entries
	keys:获取索引值
	values:获取成员值
	entries:获取索引值以及成员值:[index, item]
由于实现了数组的迭代器接口方法,就可以使用for of或者是next方法遍历
	实现了迭代器接口的数据,都有next方法,可以通过next方法来遍历成员
		返回值是一个对象
			value:表示成员值		done:表示是否遍历完成
		如果遍历完成了,此时:done将永远是true     value将永远是undefined
for of循环
for of循环是ES6专门为实现了迭代器接口的对象设计的循环结构
	for of是专门为迭代器接口设置的遍历方法。语法:for(let item of data){}
	可以像其它循环一样在内部使用continue, break等关键字
	for of也是可以遍历数组的,但是在遍历过程中,无法使用索引值
		遍历数组的时候,item表示数组的每一个成员,没有办法访问索引值,但是我们可以在外部定义一个循环变量,在循环体中手动更新。for of循环遍历数组的时候,不需要通过索引值访问成员,而for循环以及for in循环要通过索引值才能访问。
	for in也可以遍历数组,但是有一些问题:遍历的时候,key显示的是字符串,不是数字
总结:for循环用于遍历数组,for in循环用于遍历对象,for of循环遍历实现了迭代器接口的对象(包括数组)
解构
解析聚合数据的结构
	在ES5中的聚合数据有:对象、数组
	在之前,对象中获取数据的方式只能通过点语法或者中括号语法
	在之前,数组中获取数据的方法只能通过中括号语法
在ES6中简化了获取数据的方式,提供了解构语法:对象解构与数组解构
对象解构
语法:let {key1, key2, ...keys} = obj;
	key1相当于obj.key1		key2相当于obj.key2
	keys获取的是剩余的属性,如果没有剩余的属性,获取到的是一个空对象
注意:结构出来的属性、变量一定是和对象中的属性是同名的
结构问题:
	1 如果使用var解构,会污染全局对象(window),我们可以使用let关键字解决
	2 解构出来的方法,方法中的this将发生改变
	3 对于引用类型来说,只是指向的改变,而对于值类型来说,是真正的复制
逆运算:我们可以通过三个点语法,将一个对象中的所有数据传递给一个对象字面量中:{ ...keys }
注意:由于解构出来的数据会创建全局变量,因此,常常配合模块化开发使用(相当于局部变量)
数组解构
语法: let [item1, item2, ...items] = arr;
	item1表示第一个成员		item2表示第二个成员
	items表示剩余的成员
注意:如果使用var解构,会污染全局对象(window),我们可以使用let关键字解决
获取剩余成员的语法:
	1 如果数组有剩余的成员,获取到的是数组中所有的剩余成员
	2 如果没有剩余的成员,获取到的是一个空数组
	3 前面解构的变量,可以正常使用
逆运算:我们可以通过三个点语法,将一个数组中的所有数据传递给一个数组字面量中:[ ...arr ](复制数组)
默认参数
ES6提供了适配默认参数的方式,直接在参数集合中为形参赋值即可
	如果传递了参数,则使用传递的参数
	如果没有传递参数,则使用默认参数
ES6拓展的适配默认参数的方式与三元运算符的方式是等价的
函数拓展–获取剩余参数
在之前我们可以通过arguments来获取所有的参数,但是arguments是一个类数组对象,不能使用数组的常用方法,于是ES6拓展了获取剩余参数语法,获取的剩余参数是一个数组,所以可以直接使用数组的常用方法
语法:	function demo(arg1, arg2, ...args) {}
		arg1 表示第一个参数	arg2 表示第二个参数	args表示剩余的参数
获取剩余参数的语法:
	1 如果有剩余的参数,获取到的是一个由所有剩余参数组成的数组
	2 如果没有剩余的参数,获取到的是一个空数组
	3 前面参数可以正常使用,前面参数如果没有对应的参数则是undefined
	4 在箭头函数中有广泛的应用
获取剩余参数的语法逆运用:
语法:demo(...args)
	我们可以将一个数组中的成员,作为一个参数传递到一个方法中
	在之前我们可以通过apply方法,将数组中的每一项数据传递到一个方法中
		但是使用apply需要考虑this的指向问题
	我们可以使用获取剩余参数的语法,就不需要考虑this指向的问题了,正常执行函数
函数拓展–箭头函数
在ES5中定义函数的方式:1 函数定义式	2 函数表达式		3 构造函数式
在ES6中有拓展了一种方式:箭头函数
语法:let demo = () => {}
	():表示参数集合	=>:是箭头函数的标志		{}:是函数体
几点省略语法:
	1 如果参数集合中只有一个参数,即可省略参数集合
		如果使用三个点语法获取剩余参数或者是解构语法,不能省略参数集合
	2 如果函数中只有一句话,或者只有返回值的时候,可以省略return以及函数体
箭头函数的特点:
	1 无法使用arguments,但是我们可以使用三个点语法获取剩余的参数
	2 无法作为构造函数来使用
	3 箭头函数中的this指向永远是定义时的
		在普通函数中,this是执行时的上下文对象,谁调用指向谁
		无论使用call、apply或者是bind方法都无法改变箭头函数的this指向
		改变箭头函数的this指向的唯一方式就是改变其宿主环境this对象,也就是说改变其外部函数的this对象。
普通函数this是执行时的,箭头函数this是定义时的
Symbol
在js中有6种数据类型:数字、字符串、布尔值、undefined、null、对象
在ES6中又添加了一种数据类型:Symbol数据类型,表示独一无二的数据
	我们可以通过Symbol方法创建Symbol数据,参数就是对Symbol数据的描述,但是结果不受影响
	我们可以通过typeof查看Symbol数据类型,如果参数传递的是对象,默认会调用其toString方法
Symbol数据类型的出现是为了避免对象中同名属性被覆盖的问题
	我们通过Symbol创建的数据类型,就可以避免对象中同名属性被覆盖的问题
	Symbol创建的数据不能通过for in的方式查看,也不能通过Object.keys查看数据
	只能通过Object.getOwnPropertySymbols查看数据(Object.keys用来获取对象中所有的属性数据的)
	还可以通过变量,查看对应的数据类型
代理
在一个系统中,总要在一个对象中,存储一些数据,对于这些数据,可能有一些是希望我们访问的,但是总有一些是重要的,不希望我们访问的,希望保护起来,因此ES6新增了代理,实现了这一特征
语法通过Proxy实现:let proxy = new Proxy(obj, {set, get})
	第一个参数:obj表示被代理的对象
	第二个参数:{set, get}表示操作被代理对象的对象
		get(obj, key)表示取值方法:
			obj表示被代理的对象			key表示获取的属性
			返回值很重要:就是获取的数据	this指向操作对象
			注意:绝对不能获取代理对象(proxy)的key属性
		set(obj, key, value)	表示赋值方法
			obj表示被代理的对象		key表示修改的属性		value表示修改的属性值
			this指向操作对象		不需要返回值
			注意:绝对不能在里面修改代理对象(proxy)的key属性
代理跟特性很像
	特性是对同一个对象的操作,数据不能在当前属性下存储,存储在备份中
	代理是对不同的对象的操作,数据可以直接存储在当前属性下,原对象属性没有发生改变
Reflect
Reflect是对对象中一些操作方法的封装
在之前,对象中的所有方法都给了Object,这些方法都属于内部语言方法,于是将这些方法拿出来给了Reflect,因此以后调用这些方法的时候,就可以通过Reflect来调用了
所以,在未来对象中的方法可能被移除,给了Reflect。例如:
	之前定义特性的方式:Object.defineProperty,现在定义特性的方式:Reflect.defineProperty
Reflect允许对一些操作符当作方法去执行
	has:代替in运算符,检查某个属性是否存在		deleteProperty:删除对象中某一个属性
	getOwnPropertyDescriptor:获取某个属性的描述特征对象
	get:获取属性		set:设置数据的
聚合数据
在ES5中的聚合数据有:对象和数组
在ES6中又添加了四种聚合数据:Set、WeakSet、Map、WeakMap
	所以在ES6中共有六种聚合数据:对象、数组、Set、WeakSet、Map、WeakMap
Set是实现了迭代器接口的去重数组
	在去重的时候不会做类型的转换
	由于Set对象实现了数组迭代器接口,所以可以使用for of语句遍历该对象
内部提供了大量的方法用于操作该对象,属性以及方法如下:
	size:	获取数据的长度(属性)		has:	判断是否包含某个属性
	add:	添加数据				delete:	删除某项数据
	clear:	清空数据				forEach:用于遍历数据
	keys, values, entries是用于获取迭代器接口
	
	
    // 数组去重
    var arr = [1, 2, 3, 3, 4, 1];
    var s1 = new Set(arr);
    // 使用三个点语法将set对象转成数组
    console.log([...s1]);


	
WeakSet对象是弱set对象,成员只能是引用类型数据
	注意:不能添加空对象null
由于是弱set对象,因此存在的方法少,只有添加add,删除delete,判断has是否拥有三个方法
WeakSet不能被垃圾回收机制自动回收,因此要慎用



Map是一个超级对象
	传统的对象所有属性名称都必须是字符串
	但是Map对象中,定义的属性名称可以是任意类型(7种类型都可以)
	通过new Map创建map对象,实现了迭代器接口对象,因此可以使用for of循环遍历
内部也提供了大量的方法用于操作该对象,属性以及方法如下:
	size:	获取数据的长度(属性)		has:	判断是否包含某个属性
	delete:	删除某项数据				clear:	清空数据
    get:	获取数据				set:	设置数据
    forEach:用于遍历数据
	keys, values, entries是用于获取迭代器接口	

WeakMap对象是弱map对象,属性名称只能是引用类型的数据
	注意:不能添加空对象null
由于是弱map对象,因此少了很多方法,只有set,get,delete,has方法,其余的size属性,forEach,keys,values,
entries,clear等方法都不存在了
WeakMap不能被垃圾回收机制自动回收,因此要慎用
迭代器接口
在ES6中,只实现了迭代器接口(Symbol.iterator),并没有实现迭代器接口类,有四种情况会实现迭代器接口:
	1 使用迭代器接口方法的时候,如keys, values, entries等
	2 在解构的时候
	3 在创建map, set对象的时候
	4 在使用for of循环的时候
迭代器的作用:
	1 定义了我们访问数据的次序
	2 为for of提供了访问数据的方式
	3 让所有数据具备统一的接口,可以方便而快捷的获取数据
注意:类数组对象实现了迭代器接口,对象没有实现迭代器接口
Promise规范
Promise是将异步写法变为同步写法的规范
	只是写法的改变,操作并没有改变
	异步操作:在回调函数中,一层嵌套一层
	同步操作:将方法写在外部
三个状态
	pending	表示操作正在执行		resolved 表示操作执行成功	rejected 表示操作执行失败
状态的流向:在Promise中状态有两个方向的流动:
	状态由pending流向resolved,说明操作执行成功完毕
	状态由pending流向rejected,说明操作执行失败完毕
语法:	new Promise((resolve, reject) => {回调函数中执行异步操作})
	如果操作执行成功,执行resolve方法	如果操作执行失败,执行reject方法
在外部通过then方法监听状态的改变
	then(success, fail)	该方法接收两个参数
		success:表示成功时候执行的回调函数,参数是由resolve方法执行的时候传递的参数(只能传递一个),想				传递多个可以放在数组中
		fail:表示失败时候执行的回调函数,参数是由reject方法执行的时候传递的参数(只能传递一个)
then方法的返回值是Promise对象,因此,可以链式调用该方法
上一个then方法的输出,将作为下一个then方法参数的输入。如果操作已经执行完毕,then方法也会立即执行
有三个方法可以监听Promise状态:
	then:可以监听状态成功或者是失败的方法
		定义多个then方法,此时后一个then方法可以监听前一个then的成功与失败
	catch:可以监听状态失败时候的方法
		失败只能被监听一次,但是可以被后面的then继续监听
	finally:无论成功还是失败都会执行的方法
		无法接收数据
Promise规范--all
	all方法用于监听多个Promise对象
		参数是一个数组,数组中的每一项都是一个Promise对象
	我们可以通过then方法监听状态的改变
		如果所有的操作都执行成功,才会执行success方法
		如果有一个操作执行失败,则会执行fail方法
		不论是成功还是失败,返回值是数组,数组中的每一个成员对应每一个Promise返回的数据
Promise规范--race
	race方法用于监听多个Promise对象
		参数是一个数组,数组中的每一项都是一个Promise对象
	我们可以通过then方法监听状态的改变(监听第一个Promise对象状态的改变)
		如果有一个请求执行成功,就会执行success方法
		如果有一个请求执行失败,则会执行fail方法
		返回值是状态改变的时候传递的数据
Promise规范--resolve与reject
	resolve是Promise的静态方法,返回一个可以监听resolved状态的Promise对象
		参数有三种:
			js数据,此时then方法会立即执行(then方法接收的数据就是该数据)
			promise对象
			thenable参数(带有then方法的对象)
	reject是Promise的静态方法,返回一个可以监听rejected状态的对象
		then方法监听失败时候,回调函数的参数就是reject方法参数(错误的描述信息)
		不论reject方法是什么数据,then都将执行失败的回调函数
generator函数
generator函数为处理异步编程提供了解决办法(异步函数),内部封装了大量的状态,允许我们逐条遍历
语法:function *demo() {函数中定义状态}
	在函数内部通过yield关键字定义状态,yield表示暂停的意思
		注意:yield关键字只能出现在generator函数中
	通过return定义最后一个状态,return后面的状态不会执行
generator函数的返回值实现了next方法,因此可以通过next方法逐条遍历内部的状态
	next方法的返回值是一个对象
		done属性:表示是否遍历完成
		value属性:表示状态值
next方法返回的状态对象
	如果有状态的情况下,done是false, value是状态值
	如果没有状态,此时done是true, value是undefined
generator函数的返回值也实现了迭代器接口,因此也可以通过for of方式遍历内部的状态,但是for of循环无法遍历			到return状态
	但是不要同时使用两种方式去遍历内部的状态,因为,一方遍历完成,另一方就得不到状态了
当generator函数遍历完成之后,此时它的状态变为closed
当generator函数没有遍历完成的时候,此时它的状态变为suspended
return
	在generator函数的原型中提供了return方法,用于在外部停止内部状态的遍历
	如果在函数体中出现了finally语法,return语句将会延后执行
throw
	在generator函数的原型中提供了throw方法,允许在外部抛出错误
	为了代码正常执行,我们可以在状态函数体中通过try catch语句去捕获错误
	如果外部抛出两个错误:
		第一个错误在状态函数体中通过try catch语句去捕获第一个错误
		第二个错误在状态函数体外部通过try catch语句去捕获第二个错误
generator函数的数据传递
在generator函数中数据传递有两个方向:
	1 数据由generator函数的内部流向外部
	2 数据由generator函数的外部流向内部
数据由内部流向外部
	1 通过yield表达式定义状态值
	2 在外部通过next方法返回的对象中的value属性获取
数据由外部流向内部
	1 在外部通过next方法传递数据
	2 在内部通过yield表达式接收数据
generator函数–yield*
yield*语法
	可以将函数内部的状态复制到另一个函数体中执行
三个点语法
	使用三个点语法解构的时候,可以将一个状态函数体中的所有状态值获取到
generator函数的this
	在generator函数中的this指向window
	所以,不能通过this去添加任何的属性以及方法
	如果想要添加属性或者方法,我们可以在函数执行的时候,使用call或者apply方法改变其作用域,将指向函数的原型
async与await
async和await是ES2016(ES7)中提出来的
	可以认为是generator函数的语法糖
语法糖:对一些复杂操作的简化,可以使我们用更简单的方式去操作,提高了开发效率
	async表示函数中有异步操作,代表了*语法
	await表示等一等的意思,只有当前程序执行完毕之后,后续代码才会执行,代表了yield关键字
特点:
	1 提高了代码的语义化
	2 await返回值是Promise对象
	3 await后面允许是任何数据
	4 generator表示状态机,async定义的是异步函数
	5 在函数中内置状态函数的启动,直接执行函数即可,不需要通过next方法执行
当程序执行到await的时候,会交出程序的控制权,只有当异步操作完毕之后,后续的代码才会执行
	如果await后面出现了其它数据,会返回一个监听resolved状态的promise对象
	如果函数中出现了错误,会将错误信息追踪到错误队列中
返回对象
	await返回值是一个promise对象
		可以使用then方法监听成功时候状态
		可以使用catch方法监听失败时候的状态
	await与yield一样:
		await只能出现在async中		yield只能出现在generator函数中
在ES6中实现了类。语法:class 类名 {}
	ES6之前定义类的方式:function People(title) {this.title = title}
在类中可以定义三类数据:
	第一种实例数据:
		可以通过constructor构造函数定义自身属性或者是方法,这类数据会被当前实例化对象所访问
	第二种原型数据:
		我们直接在类体中定义原型方法即可。
		如果要定义原型属性数据,则必须要使用get, set设置特性的方式来定义:get取值器,set赋值器
		由于对数据设置了特性,在查看对象的时候,这些数据将展示在自身。
	第三种数据:静态数据(通过类直接访问,而实例化对象是不能访问的)
		定义静态数据的方式有两种:
			1 直接在类体中,在数据的前面加上static关键字即可
			2 在类体的外部,直接为类添加数据
		区别:
			在类体中添加的静态数据			设置了特性
			在类体外部添加的静态数据		没有设置特性
编译ES6
使用babel编译器将代码编译成浏览器支持的版本
安装node之后,可以全局安装babel指令:npm install -g babel-cli
配置.babelrc文件
	通过presets配置项定义编译器
	安装es6的babel插件:npm install babel-preset-es2015	注意:在项目目录中运行
编译文件
	输出到控制台	babel 文件
		babel .\01.js
	输出到文件中 	babel 文件 --out-file 文件名
		babel .\01.js --out-file ./dist/01.js
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值