-
全是从网上整理的(狗头保命)
-
vue3.0 与vue2.0的区别:https://juejin.im/post/6844904128628391944
- 目录结构发生变化:
- 移除了配置文件目录(config与build文件夹),但是多了env.production与env.development,除了文件位置,实际配置和2.0没有什么不同,没有config文件,跨域配置转移到vue.config文件中,配置方法不变
- 部分命令发生变化:
- 删除了vue list
- 数据监听发生变化:
- 2.0用的是object.definePromerty的getter与setter
- 3.0使用proxy监听,按需监听,速度加快。
- Vue更小:runtime-core体积压缩成了约10kb
- 创建命令:
- 2.0:vue init webpack project-name
- 3.0:vue create project-name
- 启动:
- 2.0:npm run dev
- 3.0:npm run serve
- 目录结构发生变化:
-
双向绑定与vuex的冲突:
- 不允许将vuex的值绑定到组件上,直接使用会报错:have no setter
- 解决:
- 使用get与set:
-
- 使用watch监听:
-
vue3.0的响应式原理
- 使用proxy代替object.defineproperty,因为proxy可以直接监听对象与数组的变化
- 但是Proxy只会代理对象的第一层,Vue3.0是如何处理这个问题的
- 判断当前的reflect.get是否为一个obj,如果是,就使用reactive做代理
- 检测数组的时候可能多次触发get、set,如何避免该问题?
- 可以判断key是否为当前被代理对象target自身属性,也可以判断旧值与新值是否相等,满足条件之一,才可能只需trigger
-
虚拟DOM与key值
-
什么是虚拟dom:
- 是js对象记录dom节点的副本,通过对象的方式表示dom结构,通过一些机制,将多次dom修改的结果一次性更新到页面上,来减少页面渲染次数,减少修改dom的重绘重拍次数,提高渲染性能
- 在每次数据变化前,都会把虚拟dom缓存一份,将现在的虚拟dom与缓存的虚拟dom使用diff进行对比,不同的地方就重新渲染,大大的缩减了操作真实dom的性能
- 现在前端框架基本要求就是不需手动操作dom,尤雨溪说过:框架给你保证的是,你不需要手动优化的情况下,我依然给你过得去的性能
- 修改真实dom:
- 生成html结构 =》重绘重排
- 虚拟dom:
- 生成vnode =》使用diff算法 =》更新必要的dom
- 优点:
- 跨平台:本质是js对象,可以方便的垮平台操作,比如服务端渲染,uniapp
- 缺点:
- 首次渲染大量dom,由于多了一层虚拟dom,会比innerHTML慢
- key:
- 在diff中,当新旧子节点顺序不同的时候,最佳操作应该移动元素位置达到目的
- 需要在新旧子节点中保存映射关系,以便能够在旧节点中找到哦啊可以复用的节点
-
-
keep-alive:
- 对组价进行缓存,当组件切换时不会将组件进行卸载
- 狗子函数:
- actived:每进入缓存的页面就会触发一次,不像created、mounted只会触发一次
-
类数组与数组区别:
- 类数组是个对象,具有length属性,但是不具有数组的方法
- 常见的类数组:
- arguements
- document.getElementsByTagName
- 类数组如何转换为数组:
- Array.property.slice.all
- Array.from
- Array.prototype.forEach遍历生成新的数组
-
浏览器和node的event loop
- 首先js是单线程,同一时间只能执行一个任务,那么他是如何做到异步回调的呢
- CPU:
- 计算机的核心,就像是一个工厂,所有的任务都在其中执行,并且是实时的
- 进程:
- 代表cpu所能处理的单个任务,就像一个工厂资源有限,只能一个车间运行,其他停止工作,也就是说一个cpu只能进行一个进程,但是可以通过时间片轮调度算法,同时运行多个进程
- 线程:
- 好比这一个车间的每一个工人,完成同一个任务,共享同一个资源,所以一个进程可以包含多个线程,多个线程共享同一个资源
- CPU:
- 浏览器的event loop
- js任务分为同步与异步任务,同步任务会在执行栈先执行,异步任务放到任务队列中,等待js引擎线程执行空闲之后才会依次执行异步任务
- 先执行宏任务
- 如果遇到微任务,就将其添加到任务队列中
- 宏任务执行完毕,执行任务队列的微任务
- 渲染进程:包含以下线程
- GUI渲染线程:
- 负责页面的绘制、布局
- 页面重绘重排就执行该线程
- 与js引擎线程互斥,可能会影响绘制ixaoguo
- js引擎线程:
- 负责解析执行js相关脚本
- 事件触发线程:
- 用于控制事件循环
- 满足触发条件,执行事件,将回调放入任务队列中
- 定时器触发线程:
- 执行相关定时任务
- 执行完毕后将相关的回调函数交由事件触发线程处理
- 异步http请求线程:
- 处理http请求
- 回调函数给事件触发线程处理
- GUI渲染线程:
- 首先js是单线程,同一时间只能执行一个任务,那么他是如何做到异步回调的呢
-
promise
- 是异步编程的一种解决方案,每一个异步任务都返回一个promise对象,该对象都可以使用then方法,允许指定的回调函数
- 从语法上来说,是一个构造函数
- 方法:
- then:可以接收构造函数状态处理变化,有两个参数,resolve与reject
- then也会返回一个promise对象,可以继续使用.then方法,这样也可以解决回调地狱
- all:他接收一个以promise对象组成的数组作为参数,当这个数组的所有promise对象状态变为resolve或者rejected,才会调用then方法
- race:也是以promise对象组成的数组作为参数,当数组其中一个promise对象状态为resolve或者rejected,就会调用then方法
- then:可以接收构造函数状态处理变化,有两个参数,resolve与reject
- 状态:
- pending、fulfilled、rejected
- 原理:
- 构造一个promise实例需要给promise构造函数传入一个函数,传入的函数有两个形参,同时这两个形参都是函数类型的参数,分别为resolve与reject
- promise的原型上还有个then方法,then方法就是来指定promise状态改变时确定执行的操作,resolve时执行第一个函数(onFulfilled),reject执行第二个(Onrejected)
- 当状态为resolve就不能变为reject
- 缺点:
- 一旦执行,无法取消
- 当处于pending状态,无法得知他进展到哪一步了
- 如果不设置回调函数,内部错误无法抛出
2020前端面试专题整理
最新推荐文章于 2024-07-09 21:18:14 发布