自我分析总结-V-面

128 阅读6分钟

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的创建过程?

  1. 创建XMLHttpRequest对象(创建一个异步调用对象)
  2. 创建一个新的Http请求,并指定该Http请求的方法、URL及验证信息
  3. 设置响应Http请求变化的函数
  4. 发送Http请求
  5. 获取异步调用返回的数据
  6. 使用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原型和原型链?

原型:
  1. 函数都有prototype(显示原型)属性,而prototype会自动初始化一个空对象,这个对象就是原型对象
  2. 原型对象中会有一个constructor属性,这个属性将指向了函数本身
  3. 实例化对象都有一个_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错误。