Array Includes,乘方运算符,async/await
1. Array Includes
- 在ES7之前,如果想判断一个数组中是否包含某个元素,需要通过 indexOf 获取结果,并且判断是否为 -1
- 在ES7中,可以通过includes来判断一个数组中是否包含一个指定的元素,根据情况,如果包含则返回 true, 否则返回false
- includes函数可以检测出NaN
arr.includes(valueToFind[,fromIndex])
1 | const names = ["abc","nba","why",NaN]; |
2. 乘方运算符
- 在ES7之前,计算数字的乘方需要通过 Math.pow 方法来完成
- 在ES7中,增加了 ** 运算符,可以对数字来计算乘方
1 | // 27 |
3. async/await
3.1. 异步函数
3.1.1. async function介绍
async关键字用于声明一个异步函数
- async是asynchronous单词的缩写,异步、非同步
- sync是synchronous单词的缩写,同步、同时
async异步函数可以有很多写法
1
2
3
4
5
6
7
8
9async function foo1(){}
const foo2 = async function(){}
const foo3 = async ()=>{}
class Person{
async foo(){}
}
3.1.2. 异步函数执行流程
异步函数的内部代码执行过程和普通的函数是一致的,默认情况下也是会被同步执行
1
2
3
4
5
6
7
8
9
10
11
12async function foo(){
console.log("async");
}
/**
script start
async
script end
*/
console.log("script start");
foo();
console.log("script end");异步函数有返回值时,和普通函数会有区别,返回值一定是Promise
1
2
3
4
5
6
7async function foo(){
return "Hello World";
}
const result = foo();
// Promise { 'Hello World' }
console.log(result);情况一:异步函数也可以有返回值,但是异步函数的返回值会被包裹到Promise.resolve中
1
2
3
4
5// 情况一:异步函数的返回值被包裹到Promise.resolve中
// Hello World
foo().then(res=>{
console.log(res);
})情况二:如果异步函数的返回值是Promise,Promise.resolve的状态会由Promise决定
1
2
3
4
5
6
7
8
9
10// 情况二:异步函数的返回值是Promise,状态会由Promise决定
async function foo1(){
return new Promise((resolve)=>{
resolve("Hello World");
})
}
// Hello World
foo1().then(res=>{
console.log(res);
})情况三:如果异步函数的返回值是一个对象并且实现了thenable,那么会由对象的then方法来决定
1
2
3
4
5
6
7
8
9
10
11
12// 情况三:异步函数的返回值是一个对象并且实现了thenable,状态会由then方法来决定
async function foo2(){
return {
then: function(resolve,reject){
resolve("Hello World");
}
}
}
// Hello World
foo2().then(res=>{
console.log(res);
})
如果在async中抛出了异常,那么程序它并不会像普通函数一样报错,而是会作为Promise的reject来传递
1
2
3
4
5
6
7
8
9
10async function foo3() {
throw new Error("error message");
}
foo3()
.then((res) => {
console.log(res);
})
.catch((err) => {
console.log("error",err);
});
3.2. await关键字
async函数另外一个特殊之处就是可以在它内部使用await关键字,而普通函数中是不可以的
await关键字有什么特点呢?
通常使用await是后面会跟上一个表达式,这个表达式会返回一个Promise
await会等到Promise的状态变成fulfilled状态之后继续执行异步函数
await之后的代码相当于在Promise的then中执行,必须等到await之后的代码执行结束才能继续执行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22function requestData(){
return new Promise((resolve)=>{
setTimeout(()=>{
resolve("Hello World");
},10000);
})
}
async function foo(){
const result = await requestData();
console.log(result);
console.log("code1");
console.log("code2");
}
/**
Hello World
code1
code2
*/
foo();
如果await后面是一个普通的值,那么会直接返回这个值
1
2
3
4
5
6
7async function foo(){
const result = await "123";
console.log(result);
}
// 123
foo();如果await后面是一个thenable的对象,那么会根据对象的then方法调用来决定后续的值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36// resolve
async function foo(){
const result = await {
then: function(resolve,reject){
resolve("123");
}
};
return result;
}
// res 123
foo().then(res=>{
console.log("res",res);
}).catch(err=>{
console.log("err",err);
})
// reject
async function foo1(){
const result = await {
then: function(resolve,reject){
// resolve("123");
reject("123");
}
};
return result;
}
// err 123
foo1().then(res=>{
console.log("res",res);
}).catch(err=>{
console.log("err",err);
})如果await后面的表达式,返回的Promise是reject的状态,那么会将这个reject结果直接作为函数的Promise的reject值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15async function foo2(){
const result = await new Promise((resolve,reject)=>{
// resolve("123");
reject("123");
});
console.log("result",result);
}
// err 123
foo2().then(res=>{
console.log("res",res);
}).catch(err=>{
console.log("err",err);
})