# es6
# var、let、const区别
共同点:都可以声明变量
不同点:
1、var具有变量提升机制,let和const没有
2、var可以多次声明同一个变量,let和const不可以
3、var,let声明变量,可以再次赋值,const声明常量,不可以再次赋值
# 箭头函数和普通函数的有什么区别?
1、this的指向问题
箭头函数的this只在箭头函数定义时就决定的,而且不会被call,apply,bind修改。
决定的条件是:箭头函数的this指向定义时外层的第一个普通函数的指向,如果后期修改了外层普通函数的this指向,箭头函数也不再发生更改,取决于定义时的this指向
//箭头函数
let obj = {
run:function(){
console.log('run',this)// run {run:fn}
return ()=>{
console.log(this)// {run:fn}
}
}
}
obj.run()();
obj.run().call(window);//此时指定返回函数的this指向为window,也不会发生改变
//普通函数
let obj = {
run:function(){
console.log('run',this)// run {run:fn}
return function(){
console.log(this)// window {window:window} 改变this指向为obj后 {run:fn}
}
}
}
obj.run()();
obj.run().call(obj);//此时指定返回函数的this指向为obj,会发生改变
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2、箭头函数不能new实例化(不能当作构造函数)
3、箭头函数没有prototype原型对象
4、箭头函数没有arguments
// 箭头函数
let run = ()=>{
return 111
}
console.log(run());//111
console.log(new run());//run is not a constructor at <anonymous>:1:40
console.log(run.prototype);//undefined
let run = ()=>{
cosnole.log(arguments);//arguments is not undefined
}
run();
2
3
4
5
6
7
8
9
10
11
12
# Promise
- promise有几种状态?
- promise解决了什么问题?
- promise和generator或者async和await有什么区别?
- 有没有手写过promise?
# promise有几种状态?
promise有三种状态,分别为pending(进行中)、fulfilled(已成功)、rejected(已失败)
# promise解决了什么问题?
promise是异步编程的一种解决方案,解决“死亡回调”问题,比传统的解决方案(回调函数和事件)更合理更强大。
import http from './api/http'
// 传统方式
// 缺点:可维护性差,结构乱,易读性差
http.$axios({
url:'/home'
}).then(res=>{
http.$axios({
url:'/list'
}).then(res=>{
...
//嵌套多层操作
})
})
// promise 异步解决方案 无需嵌套,链式操作
Promise.resolve('foo').then(res=>{
console.log(res);
}).then(()=>{
console.log(111)
}).then(()=>{
console.log(222)
}).then(()=>{
console.log(333)
})
// 输出:
// foo
// 111
// 222
// 333
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
promise简单来说是一个容器,里面保存着
# promise和generator或者async和await有什么区别?
Generator 函数的调用方法与普通函数一样,也是在函数名后面加上一对圆括号。不同的是,调用 Generator 函数后,该函数并不执行,返回的也不是函数运行结果,而是一个指向内部状态的指针对象,也就是遍历器对象(Iterator Object)。
下一步,必须调用遍历器对象的next方法,使得指针移向下一个状态。也就是说,每次调用next方法,内部指针就从函数头部或上一次停下来的地方开始执行,直到遇到下一个yield表达式(或return语句)为止。换言之,Generator 函数是分段执行的,yield表达式是暂停执行的标记,而next方法可以恢复执行
function* getData(){
yield 'hello';
yield 'world';
}
let t = getData();
consoole.log(t.next().value);//hello
consoole.log(t.next().value);//world
2
3
4
5
6
7
8
9
10
async和await