面试要点查漏补缺

接上篇面试总结,本文主要作为查漏补缺记录面试review list。

JS基础

  • null和undefined区别
  • 字符编码(ASCII,Unicode,UTF*8,Base64)
  • 闭包(定义、作用)
  • 运算符 对象相加过程
  • 介绍下原型链(解决的是继承问题吗)
  • 标准库toString()、Object.getOwnPropertyDescriptor(obj, ‘a’)、Object.defineproperty()
  • 数组
    • push,pop,unshift,shift,reverse,splice,sort
    • contact,slice,map,forEach,every,some,reduce
    • 数组复制
    • 类数组转化为数组(延伸:类数组对象有哪些?nodelist和htmlcollection有哪些区别)
  • 面向对象
    • new(实现过程)
    • 不加new后果?如何避免?
    • Object.create()的理解
    • this的实质?javascript为什么要设计this?
    • apply、call、bind手写代码
    • 对象的拷贝
  • 严格模式,用处
  • setTimeout和setInterval运行机制
  • js实现类的继承
  • 如何实现深拷贝:1、JSON.parse(JSON.stringify(arr)) 、2、jquery的extends({}, {a:1}) 3、自己用递归实现
  • 6种跨域方法
  • 正则
    • 零宽断言(?=pattern)、负前瞻(?!pattern)
    • 捕获和非捕获(?:)((?abc)组名为xlj)
    • 贪婪和非贪婪(默认都是贪婪的,后面加?就是非贪婪。+?、*?、{2,5}?尽可能的少)
    • 反向引用 ‘aabbccddee’.match(/(\w)\1/g)
    • 反义 [^aeiou]、\W \S \D \B
  • 常见设计模式7种。工厂模式、单例、策略、装饰者、适配器模式、代理模式、中介者模式、发布/订阅和观察者模式区别在哪,各自用在哪里。
  • es6
    • 手写promise、手写Promise.all(),手写Promise.race()
    • promise、async、Generator有什么区别
    • 对async、await的理解,内部原理
    • ES6中的map和原生的对象有什么区别
  • 缓存
    • service worker离线缓存应用解决方案
    • 了解pwa原理
  • 事件代理原理?如何自己实现?优缺点?

浏览器、网络

  • 前端性能优化
    • 浏览器输入URL到页面呈现在面前发生了什么?每一个步骤能性能优化的点。
  • 从浏览器多进程以及js单线程 深入了解完整的js运行机制
    • 进程与线程关系和区别?
    • 浏览器有哪些进程?
    • 浏览器多进程优势?
    • 渲染进程中有哪些线程?
    • 主进程与渲染进程两个进程之间是如何通信的
    • 梳理浏览器内核(渲染进程)中各个线程的管理
  • http

    • http特点、常见首部字段(通用首部、请求首部、相应首部、实体首部)、常见状态码(200、204、205、206、301、302、304、401、404、500、501、503)
    • post和get区别
    • https含义(http+ssl)、在哪一层实现的、解决了http存在的哪些问题(加密+证书+不完整的内容(中间人攻击))、加密方式
    • http协议定义的四种常见数据post方式
      www-form-ulrencoded
      multipart/form-data
      application/json
      text/html
    • 介绍http2.0
    • http1.1时如何复用tcp连接
    • 通过什么做到并发请求
  • 负载均衡(通过ngix反向代理来实现,解决高并发问题,把请求通过服务器集群中的某台调度到其他的服务器中) 和 cdn(内容分布网络,1、就近,2、减少根服务器压力)

  • http2解决了哪些问题(1、多路复用(解决chrome同域最多只能6次同时请求的问题,开一个tcp,多个请求)2、header压缩)
  • http3: 基于udp,但是收纳了tcp的精华。快有可靠
  • 遇到过哪些兼容性问题
  • dns解析过程
  • 前端性能数据如何采集
  • 前端错误监控怎么做?(window.onerror的跨域问题怎么解决?错误准确位置需要用到source-map)
  • 浏览器event loop
  • reflow 和 repaint
  • 项目中如何处理安全问题

算法coding题

  • 数组去重怎么实现?(多种方法:set、filter、includes、indexOf、splice、sort、对象属性不能一样)
  • 一串数字千位分隔,正则。
  • 1元一瓶水,2个空瓶换一瓶水, 20元换几瓶水? 递归实现
  • 给你一个能随机返回1-7的函数,如何实现能随机返回1-11的函数
  • 一堆硬币、只有一个假硬币,一个天平,最少多少次可以确定?三分搜索
  • 常见排序5种:冒泡(冒泡排序如何优化)、桶排序、选择排序、插入排序(扑克牌)、快速排序(二分)
  • 栈、队列、二叉树、二分搜索树(所有左节点比右节点值小)、AVL
  • 深度优先、广度优先(利用队列)
  • 实现函数节流和函数防抖,并阐述他们的区别与使用场景
  • sum(2, 3)实现sum(2)(3)的效果
  • 手写两个大数相加
  • 手写二叉树层序遍历
  • 【coding】JS的全排列(10分钟)

react、vue

  • react挂载和生命周期流程。首先继承react.component,每个组件实例都有render方法,render实际是用了react.createElement方法,生成实例的js对象{type:xxx,key:xxx,props: {children: {}}},在组建进行挂载过程之前,组建实例都只是js对象。然后开始reactDOM.render() 挂载,进入到合成组建的生命周期(另外三种组建都没有生命周期,node=object、string/number、null。生命周期分为mounting和mounted两种过程。另外,当出发setState的时候,事务和状态共同构成了组建的更新(当isBatching策略为false的时候,把setState回调放入dirtyComponent,最后更新的时候一次性合并更新)。如果在componetwillupdate和componentshouldupdate中执行setstate,会造成死循环,因为那会儿触发的时候pendingstatequeue变为true,变为true之后又会触发updatecomponent,而updatecomponent又会执行componetwillupdate/componentshouldupdate,造成死循环。
  • virtural dom理解、dom diff理解
  • 传统diff算法是如何运算的,为什么是O(n3)
  • react diff算法
    • tree diff
    • component diff
    • element diff (为什么加唯一id就可以优化算法?具体是怎么操作的 还原新老两棵树差异的最少步骤)
  • 介绍react优化
    • 从diff算法角度:尽量不要改变dom层级的移动、相同类型的组建不会有同样的dom结构、key不要用index用id。
    • shouldcomponentupdate、React.PureComponent
    • 纯函数
    • Fiber架构(算法、服务端渲染、异步渲染成为可能)
  • 介绍Fiber
    • 生命周期:16.X声明周期的改变、16.X中props改变后在哪个生命周期中处理
    • 服务端:rendertoString变成rendertoNodeStream;reactDOM.render变成reactDOM.hydrate(实现脱水和注水)
    • 异步渲染:让react异步渲染(分时间段渲染,优先紧事件处理)成为可能(未来两件大事:suspense(用同步的代码实现异步的操作),hooks(useState方法传入初始值))
  • react.fragment的理解,在哪种场景下使用
  • 高阶组建的理解、有何作用、使用场景(redux的connect)、如何自己实现一个高阶组建。mixins为什么会被替代?有哪些问题?
  • 组建懒加载Bundle,原理
  • Mvvm是什么,和MVC区别?
  • react和vue之间的区别
  • 合成事件的理解
  • super(pros)作用,super()一定要调用么?props一定要传么?
  • 单元测试:enzyme jest
  • react异步渲染的概念,介绍Time Slicing 和 Suspense
  • 介绍纯函数、介绍JSX、介绍高阶组件
  • 如何解决props层级过深的问题
  • 服务端渲染SSR
  • react-router如何配置、原理(当前的path和pathnamke匹配规则,有一个router-regexep包)、前端路由是如何跳转的、路由的动态加载模块、介绍路由的history、嵌套留有(可以讲讲4之前和4之后版本不同,4之后仅仅是组件)、动态路由${this.props.match.url}
  • 介绍redux数据流的流程,主要解决什么问题、redux请求中间件如何处理并发、redux如何实现多个组件之间的通信、多个组件使用相同状态如何进行管理、使用过的redux中间件、接入redux的过程 、绑定connect的过程 、connect原理、你用到了哪些redux中间件(redux-promise,redux-logger)、中间件原理(对store.dispatch进行改造,在发出action之后,reducer之前添加其他的功能。其实就是dispatch功能的增强)、如何自己实现一个redux中间件、redux实现一个简单的计时器。
  • vue
    • vue如何实现双向绑定

node相关

  • koa
    • 使用过的koa2中间件koa-compress,koa-router,koa-views,koa-bodypaser,koa-static、koa-multer
    • koa-bodyparser原理(请求报文中的content-type4种不同类型分别作出不同的处理,然后把json解码,url解码,解码结果挂载到ctx.request.body上)
    • 介绍2个自己写过的中间件
    • koa中response.send、response.rounded、response.json发生了什么事,浏览器为什么能识别到它是一个json结构或是html
    • express和koa区别
  • pm2:处理node进程的
  • cluster: 创建共享服务端口的子进程。单个nodejs单线程的,为了发挥cpou多核优势,需要启用一组去处理负载。
  • node核心模块
  • node单线程优点
  • nodejs是如何做到I/O的异步和非阻塞的呢

css、html

  • css3有哪些新属性
  • html5新特性
    • websocket协议了解
    • 新特性。canvas、音频视频radio video、localStorage和sessionStorage、webworker、websocket、html5语义化标签header、nav、footer、article、section
  • 介绍css3种position:sticky
  • 清除浮动
  • transform动画和直接使用left、top改变位置有什么优缺点
  • 动画的了解
  • flex
  • 水平垂直居中
  • CSS3中对溢出的处理
    display: -webkit-box;
    -webkit-box-orient: vertical;
    over-flow: hidden;
    text-overflow: ellipsis;
    -webkit-line-clamp: 2
  • positioon sticky(黏性布局,position:sticky;top、:0)、unset(可继承属性,类似于inherit,对于非继承属性,类似于initial)
  • bfc:定义的渲染规则:看这两篇就懂了BFC与IFC概念理解+布局规则+形成方法+用处浅谈BFC和IFC
    • box垂直方向一层一层排列
    • maigin垂直方向会合并
    • 计算高度的时候float也会算进去
    • 两个bfc互相独立
  • 如何触发bfc:
    • overflow:非visible
    • dispaly:absolute,fixed
  • bfc可以解决哪些问题:
    • 清除浮动
    • float:left两列布局
    • margin 不合并
  • 如何清除浮动
    • 添加空div,clear:both
    • 父元素直接添加height
    • 父元素overflow:hidden,就会触发一个bfc,自动计算浮动元素高度
  • 水平垂直居中方案
    • 1、absolute,top:50%,left 50%,transform: translate(50%, 50%)
    • 2、dosplay:flex,align-items:center: justify-content:center
  • 两列布局,左固定,右自适应
    • 1、absolute、margin*left:200px
    • 2、float:left over*flow:hidden
    • 3、display:flex,flex:1
  • css3如何实现动画,有啥区别

    • 1、transition:width 3s
      *2、animation:@keyframeg
  • 有哪些多屏适配方案

    • media query + rem
    • em和rem区别是啥?
    • 弹性布局

其他

  • 区别ing
    • white-space和word-break和word-wrap区别
    • 伪类和伪元素的区别
    • exports和module exports、export和export default的区别
    • http长连接和websorket长连接的区别
    • npm install –save 和 npm install –save-dev的区别
  • 对于AST的理解
  • iconfont引入的方式
  • 文件上传如何做断点续传(html5的input type=”file”, 把几个G的文件首先用唯一md5标识(用来告诉后端是哪个文件的)用slice(0,10 1024 1024)每10MB分割,如果碰到网络问题,2s后尝试重新连接。后端拿到md5信息的文件的时候,可以从数据库中查找是否已经有这个文件了,并且告诉客户端,直接从第x个芬片开始传,就节省了前面x*1次的分片的传输了)