持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情。
整理ES6完整知识点,持续更新中......
对象的扩展
1.属性的简介表示方法
在ES6中是允许在大括号里面,直接写入变量和函数,作为对象的属性和方法:
- 属性名简写
let x = 10;
let obj = {x};
console.log(obj); // x=10
- 函数简写
let obj ={fn(){}};
- 模块中
module.exports={
fn
};
export {fn};
2.属性名表达式
ES6允许字面量定义对象时,把表达式放在[]内,作为对象的属性名:
let str = 'myname';
function myage(){
return 'age';
}
let obj3 ={
[str]:'wei',
[myage()]:12
}
console.log(obj3) // {age: 12 ,uname: "kevin"}
3.Object.is(value1, value2)
说明:在所有环境中,只要两个值是一样的,它们就相等,Object.is()用来比较两个值是否严格相等,与严格比较运算符(===)基本一致,不用之处在于:+0不等于-0,NaN等于NaN。
4.Object.assign()
Object.assigh()方法用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target)。
- 语法:Object.assign(target,source1,source2,...);
- 返回值:target
5. Object.keys(),Object.values(),Object.entries()
- Object.keys():获取对象的键名
- Object.values():获取对象中的键值
- Object.entries():成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键值对数组
Promise
Promise是异步编程的一种解决方案,比传统的解决方案(回调函数和事件)更合理和更强大,有了Promise对象,就可以将异步操作按照同步操作的流程表达出来,避免了层层嵌套的回调地狱。
Promise简单来说就是一个容器,里面保存着某个未来才会结束的事件结果,通常是一个异步操作;Promise提供统一的API,各种异步操作都可以按照同样的方法进行处理;
- 语法:
// Promise是一个构造函数,使用时需要new
let p = new Promise(function(resolve,reject){
// 异步
resolve(data) // 保存请求成功时的结果
reject(err) // 保存请求失败时的错误信息
})
// 把Promise容器中保存的结果拿出来
p.then(function success(data){},function error(err){})
- promise 有三个状态
1. pending[待定]初始状态
2. fulfilled/resolved[实现]操作成功
3. rejected[被否决]操作失败
当promise状态发生改变,就会触发then()里的响应函数处理后续步骤;
promise状态一经改变,不会再变。
Promise对象的状态改变,只有两种可能:
从pending变为fulfilled
从pending变为rejected。
这两种情况只要发生,状态就凝固了,不会再变了。
- Promise.prototype.then()
then(function(data){
// 成功,可以获取成功结果
},function(err){
// 失败,可以获取失败信息
})
then方法返回的是一个新的Promise实例(注意,不是原来那个Promise实例)。因此可以采用链式写法,即then方法后面再调用另一个then方法。
then方法中如果没有显式的写return,就会默认return undefined;
then方法中的return 后是一个具体的值,那么promise会直接把这个结果保存到成功状态中;
then方法中return后自己写new Promise,最终的状态就和你写的new Promise返回结果有关;
// 链式写法
new Promise()
.then()
.then()
.then()
从第二个then开始,这些then都是上一个then返回的新的promise实例的then方法
- Promise.prototype.catch()
.catch() = .then(null,function(err){})
// catch方法可以捕获promise中任意位置的错误
- Promise.prototype.finally()
不管Promise是成功了还是失败了,这个方法一定会执行。
- Promise.all()
- Promise.all()方法用于将多个 Promise 实例,包装成一个新的 Promise 实例
- 语法:
Promise.all([p1,p2,p3]);
- 返回值:
1. 当p1,p2,p3都成功时,能获取到这个三个promise的成功结果,组成一个数组
2. 当这三个promise有任意一个失败,Promise.all就返回失败结果
- Promise.race()
// 获取最快执行完成的promise的结果
- Promise.race()方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例,只要p1、p2、p3之中有一个实例率先改变状态,p的状态就跟着改变。
- 语法:
Promise.race([p1,p2,p3])
- 返回值:
只要p1、p2、p3之中有一个实例率先改变状态,p的状态就跟着改变。// 就是最快完成的那个promise的结果
- Promise.resolve()
Promise.resolve()直接把promise的状态设置成功状态
- Promise.reject()
直接把promise的状态设置失败状态
- Promise.allSettled()
- 接受一组 Promise 实例作为参数,包装成一个新的 Promise 实例。只有等到所有这些参数实例都返回结果,不管是fulfilled还是rejected,包装实例才会结束。
- Promise.allSettled([p1,p2,p3]);
Generator
Generator 函数是 ES6 提供的一种异步编程解决方案,语法上,首先可以把它理解成,Generator 函数是一个状态机,封装了多个内部状态,执行 Generator 函数会返回一个遍历器对象,可以依次遍历 Generator 函数内部的每一个状态。
Generator 函数是一个普通函数,但是有两个特征。
-
function关键字与函数名之间有一个星号;
-
函数体内部使用yield表达式,定义不同的内部状态(yield在英语里的意思就是“产出”)。
执行Generator后返回值遍历器对象,这个对象上有一个方法next(),调用这个方法才能执行Generator 函数内部的每一个状态。
next方法返回一个对象,它的value属性就是当前yield表达式的值hello,done属性的值false,表示遍历还没有结束。
- 语法:
function * demo(){
yield Promise.resolve(123);
yield new Promise(function(resolve,reject){
$.get('xxx',function(data){
resolve(data)
})
})
}
- 用法:
let it = demo()
it.next()
it.next('cs')
- co库
co(demo()).then(function(data){console.log(data)})
async 函数
Generator 函数的语法糖(新语法)。
- 语法:
async function demo(){
await 1;
await 2;
};
demo();
- async函数对 Generator 函数的改进,体现在以下四点:
- 内置执行器
- 更好的语义
- 更广的适用性
- 返回值是 Promise
-
async函数返回一个 Promise 对象
-
Promise 对象的状态变化:默认的,async函数返回的 Promise 对象,必须等到内部所有await命令后面的 Promise 对象执行完,才会发生状态改变,除非遇到return语句或者抛出错误。
-
任何一个await语句后面的 Promise 对象变为reject状态,那么整个async函数都会中断执行,则reject的参数会被catch方法的回调函数接收到
-
await 也是状态机,只有await后的代码执行完成后才能向后执行,await还能执行promise的.then方法。正常情况下,await命令后面是一个 Promise 对象,返回该对象的结果。如果不是 Promise 对象,就直接返回对应的值。