记录前端面试题(持续记录)

71 阅读4分钟

前端登录流程是什么?

  1. 点击登录后,前端带着登录名和登录密码调用后端接口。
  2. 后端收到请求进行验证,如果验证失败,则会返回错误信息;如果验证成功,则后端返回token。
  3. 前端将token保存到vuex和localstorage中,并跳转页面,登陆成功。
  4. 将token封装在拦截器中,在需要进行权限验证的页面,后端要判断请求头中是否携带有正确的token,验证成功则正常返回数据,验证失败返回响应错误码。前端拿到错误码,清楚token并跳转到登录页。

为什么token要同时存在vuex和localstorage中?

 因为vuex存储的数据是响应式的。在一个组件更新,会影响到其他组件,如果只存在vuex中,刷新页面,vuex的数据就会初始化,导致数据丢失
而localstorage存储的数据是永久的,但是不能同步更新。
vuex是将数据存储到内存中,localstorage将数据存储到磁盘中,所以在vuex中的数据读取更快。
在项目中经常会结合两者使用,将token存储到localstorage和vuex中,vuex保证数据同步更新,如果页面刷新丢失数据,就从localstorage获取,通过两者结合的方式,实现数据的持久化存储。

说说对前端组件化、模块化的理解

  1. 模块化是从代码的角度分析,将可复用的代码,封装在模块中;
  2. 组件化是从ui界面角度分析,将可复用的ui元素,封装为组件, 两者都是为了方便项目的开发和维护

Vue中的$nextTick有什么作用?

Vue的dom更新是异步执行的,修改数据,试图并不会立即更新,而是将其缓存在同一事件循环中,等到所有数据变化完成再统一更新视图。如果我们在还没更新试图的时候就使用到其中的元素,得到的是变更前的数据,这时候使用nextTick方法,就能获取到更新后的dom 概括:nextTick主要是处理数据动态变化后,dom未及时更新的问题。使用nextTick可直接获取到数据更新后的最新dom

讲一下浏览器的渲染机制

  1. 浏览器将获取的html文档解析生成dom树
  2. 处理css标记,构成层叠样式表模型CSSOM(css object model)
  3. 将dom树和cssom合并,生成渲染树,代表一系列将被渲染的对象。
  4. 渲染树的每个元素包含的内容都是计算过的,被称为布局layout。浏览器使用一种流式处理的方法,只需要一次pass回执操作就可以布局所有的元素。
  5. 将渲染树的各个节点绘制到屏幕上,这一步被称为绘制painting

堆和栈的区别

  • 栈由系统分配,速度更快;堆是人为申请的,速度较慢
  • 栈获得的空间较小,堆获得的空间较大
  • 栈是连续的空间,堆不是

for...in和Object.keys有什么区别?

  • for..in循环遍历对象,依次返回对象的属性值
  • Object.keys方法,将对象的属性值以对象的形式返回
  • 两者的区别,for..in会走原型链,object.keys不会

变量提升如何理解,var和function提升有什么区别?

 var定义变量,声明的变量名会提升到作用于顶部,赋值操作不对提升;而function声明函数,整个声明语句都会被提升。
变量提升,提升的是对函数或者变量的声明。而不是赋值。

事件冒泡和事件捕获。事件委托是什么原理?

  • 事件冒泡:事件由子元素传递到父元素的过程就是事件冒泡
  • 事件捕获:事件由父元素传递到子元素的过程
  • 事件委托其实就是利用了事件冒泡的原理,将子元素的事件都绑定到父元素上。如果子元素阻止了事件冒泡,那么委托也就无法实现

link和@import的区别

  • link是HTML标签,@import属于CSS提供的方式
  • 加载顺序:link引入会和页面同步加载。@import引入会在页面加载完成后再加载,可能会存在页面闪烁问题
  • 兼容性:link没有兼容性问题。@import是CSS2.1提出的,只能在IE5以上版本被识别
  • 当使用javascript控制dom改变样式的时候,只能使用link。@import是不被dom所控制的

单行文本溢出显示省略号

  • 设置容器宽度 {widht:*px}
  • 强制不换行:white-space:nowrap
  • 溢出内容隐藏:overflow:hidden
  • 溢出显示省略号:text-overflow:ellipsis

...