# js
## √Event loop
event loop 其实就是 js 的执行机制,因为 js 是单线程的,他会将所有的任务放在一个主线程上逐步执行,主要分为同步和异步,先执行同步任务,同步任务全部执行完之后执行异步任务,异步任务又分为了宏任务和微任务,先执行宏任务,主要包括 script、setInterval,setTimout,一个宏任务执行完毕后再执行微任务(promise.then 后面的逻辑,nextTick),执行一个宏任务可以执行多个微任务,执行宏任务的时候按照代码先后顺序执行,以此来进行一个事件轮询
检查主线程为空:js 引擎存在 monitoring process 进程,会持续不断的检查主线程执行栈是否为空,一旦为空,就会去 Event Queue(任务队列)检查是否有等待被调用的函数。这个过程是循环不断的,所以整个的这种运行机制又称为 Event Loop(事件循环机制)。
## √js 数据类型
js 数据类型主要分为基本类型和引用类型
基本类型主要包括:undefined,number,string,null,boolean,symbol,存在栈内存中
引用类型主要包括:array,function,object,存在堆内存中
**基本和引用的区别**
基本数据类型:操作的是值,并且值存储在栈内存中
引用数据类型:操作的是堆内存的引用地址,并且会把对象中的键值对放在堆内存中
## √get 和 post 区别
get 能够缓存但是不安全,长度不能超过 4k,会保存历史记录
怎么让 get 失效:添加一个拦截器就可以实现,这个拦截器最好是你自己实现,过了这个拦截器你的什么参数都没有了
post 不支持缓存,但是安全,请求数据大小没有限制
## × 输入 url 发生了什么
1.DNS 解析(浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址)
2.建立 TCP 连接 (三次握手)
3.发送请求,分析 url,设置请求报文(头,主体)
4.服务器返回请求的文件 (html)
5.释放 TCP 连接(四次挥手)
6.浏览器渲染 html 文本并显示内容
## √ 数据类型判断
数据类型判断可以通过 typeof,instanceof
typeof 返回的是一个表示数据类型的字符串
instanceof 是用来判断 A 是否为 B 的实例,用来测试一个对象在原型链中是否存在构造函数的 prototype 属性,不能检测 null 和 undefined
object.prototype.string.call()
## √call,apply,bind 的区别
他们三个主要都是用来改变 this 指向的
call 和 apply 在改变 this 指向的时候调用了函数,但是 bind 没有调用,而是生成了一个新的函数,call 和 bind 是逐个进行传参,apply 是通过数组的方式进行传参
## √this 指向问题
1.直接调用的时候,this 指的是 window
2.在 obj.函数,this 指向的是谁就调用了谁的函数
3.在构造函数里面,this 指向的是当前类的实例
4.箭头函数没有自己的 this 指向,看看是否有外层函数,如果有外层函数,外层函数的 this 指向就是箭头函数的 this 指向,如果没有 this 指向 window
5.call,appiy,bind 指向的是第一个参数
## √ 原型,构造函数,实例
原型:他是一个简单的对象,用于实现属性的继承,每个 js 对象都有一个--proto--的属性指向该对象的原型
构造函数:可以通过 new 来实现一个对象的函数,我们可以把对象中的一些公共的属性和方法抽离出来,然后封装到这个函数里面
实例:通过构造函数和 new 出来的的对象,通过 proto 指向原型,通过 constructor 指向构造函数
**new 在执行时会做四件事情:**
1.在内存中创建一个新的空对象
2.让 this 指向这个新的对象
3.执行构造函数里面的代码,给这个新的对象添加属性和方法
4.返回这个新的对象(所以构造函数里面不需要 return)