Zhili's blog Zhili's blog
首页
关于
GitHub (opens new window)

Zhili

转型中的前端老兵
首页
关于
GitHub (opens new window)
  • webpack 区分环境使用CDN以及HtmlWebpackPlugin插件的编写
  • 使用 Mpvue 开发小程序总结
  • 前端知识汇总-持续更新
  • webGL知识汇总-持续更新
  • React思想要点
  • Mapbox 入门初试
  • 构建自己的 GLSL 绘图器 - 2d 版
  • webGL二维有向距离场(SDF)及布尔运算
  • webGL入门:绘制一个三角形
  • 使用 GLSL 绘图尝试:绘制正弦曲线
  • 简单解析虚拟 DOM
  • 自己动手开发一个 markdown 转微信文章工具
  • Vue组件扩展及权限管理的实现技巧
  • 使用 CSS 绘制三角形
  • Nginx 前端配置和使用
  • webpack按需加载配置和babel编译
  • 面试总结39题
    • 使用node反向代理接口改造旧项目
    • 可视化表单搭建系统的开发与思考
    • 前端
    zhili
    2020-10-11

    面试总结39题

    最近开始找工作,总结了一些前端面试可能会问的问题

    # 1.Vue生命周期(6个)

    beforeCreate,created,beforeMounte,mounted,beforeDestroy,destroyed

    # 2.JWT是否了解,

    答:原理不是很了解,只知道token的使用

    # 3.VueX的API有哪些,一般怎么使用,用在什么地方?

    答:token的存储,用户信息的存储,公共数据的存储。

    Api:state、getter、mutation、action、(map…),

    Store本质是在构造函数中new 一个Vue示例vm,vm的data为{state},同时设置state的get和set方法,get直接返回vm.state,set则发出警告,只能通过mutation进行设置数据。

    getter可以对数据进行缓存,即为vm的computed属性,调用getter的时候实际是调用内部vm对应的computed属性。

    mutation函数会存到一个数组中(因为会有重名),然后调用commit的时候会拿出对应的方法对state进行修改。

    Action会判断函数是否有then方法,进行异步调用。

    namespace本质是state.[namespace],map...方法做了转换

    # 4.Vue-Router 是否了解,原理是什么?

    Vue路由有2种,hash和history,hash监听hashChange, history监听popstate事件。

    # 5.箭头函数的特点,有无arguments,是否可以使用new ,为什么

    答:箭头函数为匿名函数,作用域为其上层作用域,this为其上层的this,无arguments参数,不可以作为构造函数。

    # 6.Webpack的loader和plugin的区别

    Loader是对各种文件的加载和处理,为流处理,上一个loader的结果为下一个的参数。

    Plugin是插件,是对webpack的补充,在webpack的loader处理之后对结果进行修改,它是基于事件机制,在webpack编译过程的事件进行监听,处理相关结果。

    # 7.Websocket是否了解,在哪些地方用会比较合适?

    最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。(聊天室)

    # 8.ES6 的import 、export是否有了解,谈下自己的认识

    Import是静态引入,路径不能有参数,

    # 9.路由权限有无做过?

    有,在meta中配置角色标签,根据登录用户的角色去匹配,动态生成用户的路由表。AddRoutes方法;也可以直接根据用户在后端配置好路由表,再通过接口获取用户的路由。

    # 10.Location.href 和vue-router 跳转有什么区别?

    无论是 HTML5 history 模式还是 hash 模式,它的表现行为一致,所以,当你要切换路由模式,或者在 IE9 降级使用 hash 模式,无须作任何变动

    # 11.ES6的Set和Map有什么用处,let和var的区别

    let的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效.

    # 12.Promise如何在成功和失败后都去掉页面请求的loading?

    答:在finally中处理

    # 13. 协商缓存和强缓存 (opens new window)

    1. 强缓存:不会向服务器发送请求,直接从缓存中读取资源,在chrome控制台的network选项中可以看到该请求返回200的状态码;

    2. 协商缓存:向服务器发送请求,服务器会根据这个请求的request header的一些参数来判断是否命中协商缓存,如果命中,则返回304状态码并带上新的response header通知浏览器从缓存中读取资源; 两者的共同点是,都是从客户端缓存中读取资源;区别是强缓存不会发请求,协商缓存会发请求

    # 14.Vue 指令的钩子有哪些?指定的参数有什么,指令会执行几次?

    钩子函数有:bind,inserted,update,componentUpdate,unbind。

    参数:el,name,binding,vnode,oldVnode

    # 15.Vue create 里写一个this.$nextTick(()=>console.log(‘aa’)) ,mounted里面也有console.log() ,谁先执行?

    # 16.浏览器内核知道多少? (这简直了,谁知道)

    Trident(IE)、Gecko(firefox)、Blink(Chrome新)、Webkit(safari)

    # 17.浏览器多个标签页之间如何通信? (worker可以)

    Worker 可以跨域通信,postmessage,

    Localstorege也可以跨标签使用。

    # 18.有没有做过一些组件封装 ?(table页面的封装)

    # 19.页面为什么会白屏,以及对首页白屏的处理

    在地址栏输入URL会经历以下步骤:

    1、 查找域名DNS,找到对应服务器的IP,

    2、 建立TCP连接,向服务器发出请求。

    3、 服务器响应请求,浏览器拿到数据进行解析

    4、 浏览器拿到html,从上向下进行解析渲染,解析DOM和CSS,计算页面布局,遇到JS会进行解析,运行JS,阻塞页面渲染。一边渲染一边显示页面内容,图片等内容会异步加载。

    优化:选择合适的CDN加速,提高服务器带宽和响应速度,首屏减少内容,按需加载,优化JS位置,防止页面阻塞,使用骨架屏,防止用户等待过久。

    # 20.web标签语义化怎么理解

    # 21.iframe通信问题及处理

    # 22.浏览器兼容性问题,css,布局相关

    # 23.浏览器安全相关的问题

    # 24.Taro和Uniapp的区别

    # 25.VueRouter的钩子函数

    # 26.瀑布流和懒加载

    # 27.ES6用过哪些

    # 28.CSS会阻塞JS文件执行吗

    会,CSS不会阻塞DOM树的解析,但是会阻塞渲染,以及JS的执行。(不然的话,如果在JS里获取DOM元素的颜色,如果不阻塞的话会导致JS不可靠)

    # 29.微任务和宏任务,哪些是微任务哪些是宏任务

    JS事件循环,分为同步任务和异步任务,异步任务会放到事件循环任务队列,当同步任务执行完以后,会把异步事件队列中的任务放到主线程中。

    微任务先执行,再执行宏任务

    宏任务常见的有:setTimeout、setInterval、setImmediate

    微任务有:Promise、process.nextTick、MutationObserver

    # 30.堆和栈简单说一下

    堆是存放引用类型,栈是存放基本类型

    # 31.一段函数需要执行60多秒,怎么防止页面阻塞,任务如何拆分

    # 32.多段文字如何查找到某个字符在哪一段

    # 33.闭包是什么?会导致内存泄漏吗

    JS里面只有函数作用域和函数作用域,闭包就是在一个函数里面返回另外一个函数,返回的函数绑定了它所在函数的当前上下文。闭包不会导致内存泄漏,闭包会导致变量无法回收,占用大量内存,在旧的IE浏览器中会导致内存泄漏。

    # 34.如何查找内存泄漏,如何分析

    # 35.vue vnode和diff算法简单说一下,什么是vnode?

    虚拟DOM 就是使用js模拟真实DOM,所有操作都在虚拟DOM上进行,数据更新时对比虚拟DOM,计算出更新DOM的最小操作,由框架去完成DOM的更新,让用户更专注于业务逻辑。

    # 36.Vue修改一个组件的数据,更新对比是从该组件开始还是从根节点开始

    应该是在该组件进行更新,因为有依赖收集,通知依赖的地方进行更新。

    # 37.Vue一个Home页面有A,B 2个组件,它们的生命周期是怎么样的?

    一个页面模板结构如下:

    <div>
        <A/>
        <B/>
    </div>
    
    1
    2
    3
    4

    首先是Home组件初始化,调用 beforeCreate、created、beforeMount ;然后根据子组件顺序,分别调用A,B组件的 beforeCreate、created、beforeMount 生命周期钩子函数,然后是A组件的 mounted , B 组件的mounted ,最后是 Home的 mounted

    销毁的时候:先是Home 的 beforeDestroy ,然后是A 的 beforeDestroy、destroyed , B的beforeDestroy、destroyed ,最后Home的destroyed

    # 38.Vue组件里是先解析template还是先挂载data

    先初始化data,原因是在created生命周期完成数据初始化,数据设置为响应式,在getter收集依赖,在setter中通知视图进行更新,然后在beforeMount里编译模板,这时候模板里使用到数据的时候会出发getter依赖被收集,因此,先初始化data,再初始化模板,然后挂载渲染。

    # 39.有一个耗时长的任务怎么提升用户体验呢

    1. 对任务进行分解,分成一些小任务,然后进行时间分片,分片进行处理,可以使用Generator函数让出控制权进行分片处理。

    如何评估任务的时间:操作系统通过任务需要的数据堆栈来评估。

    预设值一些任务的优先级,动画,用户操作等优先级较高,非可视区界面更新的优先级会较低。

    1. 使用web worker或者定时器进行分片

    参考 react fiber 以及这篇博文 (opens new window)

    编辑 (opens new window)
    #JavaScript#总结
    上次更新: 2022/03/14, 06:54:51
    webpack按需加载配置和babel编译
    使用node反向代理接口改造旧项目

    ← webpack按需加载配置和babel编译 使用node反向代理接口改造旧项目→

    最近更新
    01
    可视化表单搭建系统的开发与思考
    03-09
    02
    使用node反向代理接口改造旧项目
    11-17
    03
    webpack按需加载配置和babel编译
    10-10
    更多文章>
    Theme by Vdoing | Copyright © 2022-2023 zhili | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式