axios、js面试相关
promise存在的理由?
在现实项目中,通常这一次异步请求的数据会作为下一次异步请求的方法,那么就会通过回调函数来嵌套处理,这样容易造成回调地狱问题。promise正是解决这个问题而存在
promise的三种状态?
等待(panding)、已完成(fulfilled)、已拒绝(rejected) promise必须实现then方法(也可以说then是promise的核心),而且then必须返回一个promise,同一个promise的then可以调用多次,并且回调的执行顺序跟他们被定义的顺序一致。
async、await
async+await是将promise进行优化,将异步代码优化成同步代码。
- 对于await,promise只能接收成功的resolve()的结果,对于reject()的结果是会报错的
- 解决报错:1.用try catch去捕获异常 2.通过返回一个处于pending(即将发生)状态结果来终断promise链。
简述ajax的创建过程?
- 创建XMLHttpRequest对象(创建一个异步调用对象)
- 创建一个新的Http请求,并指定该Http请求的方法、URL及验证信息
- 设置响应Http请求变化的函数
- 发送Http请求
- 获取异步调用返回的数据
- 使用JavaScript和Dom实现局部刷新
TCP的三次招手
防止产生错误的连接,使用可变大小的窗口协议
如何终断ajax发送请求?
- 设置超时时间让ajax自动断开
- 另一种为手动去停止ajax请求,其核心是调用XMLHttpRequest对象上的abort方法
请求过来的数据能立即使用吗?为什么不能立即使用,怎么样才能使用?
不能,因为在请求的函数内部,外部无法调用。利用深浅拷贝来实现
什么是深浅拷贝?
- 浅拷贝: 只对数据的第一层进行复制,如果数据存在多层,那么第二层就不会复制,还是引用关系(处理方法如下:...展开运算符,for循环、lodash)
- 深拷贝: 对数据进行深层拷贝复制,一旦拷贝以后,数据将不会存在引用关系(处理方法如下:JSON.parse(JSON.stringify()),但这个方法会丢失undefined和函数值)
cookie、localStorage、sessionStrage有什么区别?
- 储存空间:cookie储存空间最小,只有4kb左右,localStorage、sessionStrage有5MB左右
- 有效期:cookie不设置过期时间,关闭浏览器销毁;localStorage本地存储,本地持久化需要主动删除;sessionStrage会话存储,页面关闭删除
宏任务(macrotask)和微任务(microtask)
- 微任务:通常来说就是需要在当前任务执行结束后立即执行的任务,这样便可以减小一点性能的开销。如:nextTick、promise、requestAnimationFrame
- 宏任务:就是JS 内部(任务队列里)的任务,严格按照时间顺序压栈和执行。如 setTimeOut、setInverter、setImmediate 、 MessageChannel等
- 在挂起任务时,JS 引擎会将所有任务按照类别分到这两个队列中,首先在 macrotask 的队列(这个队列也被叫做 task queue)中取出第一个任务,执行完毕后取出 microtask 队列中的所有任务顺序执行;之后再取 macrotask 任务,周而复始,直至两个队列的任务都取完。
闭包是什么?
闭包形成的条件:
- 函数嵌套,外部引用返回内部函数,内层使用外层变量 闭包的作用:
- 形成不被销毁的执行空间,延长变量的生命周期。
- 形成块作用域定义私有变量。
- 外部可以访问内部函数的变量,变量作用域扩展,内部函数访问外部函数
什么是内存泄露?什么是生命周期?
- 内存泄露也称为储存泄露,简单说就是该内存空间使用完后未进行回收
- 从诞生到消亡的一个过程叫做生命周期,在程序中表示-程序初始化到销毁的过程
如何解决内存泄露?
引用计数法和标记清除法
说一说js原型和原型链?
原型:
- 函数都有prototype(显示原型)属性,而prototype会自动初始化一个空对象,这个对象就是原型对象
- 原型对象中会有一个constructor属性,这个属性将指向了函数本身
- 实例化对象都有一个_proto_(隐式原型)属性,_proto_属性指向原型对象
原型链:
从实例对象往上找构造这个实例的相关对象,然后这个关联的对象再往上找,找到创造它的上一级的原型对象,以此类推,一直到object.prototype原型对象终止,原型链结束
axios和fetch的区别
Vue相关
什么是路由懒加载?
即按需加载,使用webpack打包根据
为什么data必须是一个函数?
对象为引用数据类型,当组件复用时,由于数据对象都指向同一个data,当其中一个组件修改data时,其他组件的data也会被修改。而使用返回对象的函数,每次返回的都是一个新的object实例,引用地址不同则不会出现这个问题。
computed和watch的区别
计算属性computed:
- 支持缓存,只有依赖发生改变,才会重新进行计算
- 不支持异步,当computed内有异步操作无效,无法监听数据的变化
- 如果一个属性是由其他属性计算而来,这个属性依赖其他属性,是一个多对一或者一对一
监听属性watch:
- 不支持缓存,数据变,直接会触发相应的操作
- watch支持异步,监听的函数接受两个参数,第一个是最新的值,第二个是输入之前的值
- 当一个属性发生变化时,需要执行对应的操作。一对多
MVVM原理
- 数据双向绑定采用数据劫持和发布订阅者模式,通过object。defineproperty()来劫持各个属性的setter、getter,在数据变动时发布消息给订阅者,触发相应的监听回调。
- vue3是通过Object。defineProperty()==指定对象、对象内的具体属性。
组件传值
- 父传子-props()
- 子传父-$emit()
- 兄弟组件传值-通过中央通信let bus=new Vue()、通过vuex
$nextTick是什么?
nextTick是在下一次Dom更新循环结束之后执行的延迟回调,在修改数据之后使用nextTick,则可以在回调中获取更新后的DOM
Vue的路由实现:hash和history模式
- hash模式:在浏览器中符号‘#’,在#以及#之后的字符称之为hash,用window。location.hash读取,在hash模式下,hash模式之前的地址也会被包含在内,如果不对路由做到全覆盖则会返回404错误。
- history模式:采用HTML5新特性;且提供了两个新的方法:pushState()、replaceState()可以对浏览器历史记录栈进行修改,以及对popState时间的监听状态变更。在history模式下,前端的路由必须和后端的路由一致,如缺少对index/id的处理,将返回404错误。