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