最近面试小结

背景

最近在休假,趁有点时间就想着去别的单位面试,主要是想了解下现在对前端岗位的要求,避免自己长时间处于一个温水煮青蛙的状态,尤其是前端技术日益更新,如果没有持续学习很有可能就要被淘汰了。(出于尊重面试单位目的,在这里就不透露面试单位的名称了)
下面就来说说最近面试都遇到什么问题,最近去了几家单位面试,面试中问的也是多种多样

JavaScript基础

JavaScript基础这一块基本是前端岗位必不可少的,掌握基础也是作为前端开发基本素质:

  • 基本数据类型
  • 跨域
  • 闭包
  • 函数作用域和全局作用域
  • 数组常用的API
  • 正则匹配
  • 原型链和继承
  • apply、call和bind的区别和用法

ES6

  • let、const、var之间的区别
  • 箭头函数
  • Promise的使用
  • 解构赋值
  • 块作用域
  • Class

浏览器和HTTP

  • 浏览器缓存
  • 页面渲染过程,重绘和重排
  • 事件队列和Event Loop
  • HTTP头部字段和状态码

构建工具

  • Webpack工作流程、常用的Webpack插件
  • Gulp和Webpack的区别,Gulp的API

Vue.js和React

  • 生命周期和钩子函数
  • 组件间的通信
  • Vue.js响应式原理
  • React的单向数据流和事件绑定

项目相关和软技能

  • 说一下做得比较好的项目
  • 项目中遇到了什么问题、怎么解决的
  • 项目中做了什么优化
  • 为什么会在项目使用Vue.js
  • 多人协作的项目该怎么去设计
  • 怎么设计一个组件,比如列表滚动加载
  • 通过做的项目,你对前端有什么认识
  • 项目即将遇到海量的访问,需要做什么准备

Node.js和Nginx

  • Node.js的了解和使用
  • Nginx的配置和负载均衡

算法和数据结构

  • 常见的数据结构
  • 排序算法的了解,时间复杂度
  • 二分查找

以上是我去面试中级Web前端开发遇到的面试题(包括电话面试和笔试)的整理,项目相关的会问得比较细。

面试编程题

面试的这几个单位中,遇到一家面试前面试官给我20-30分钟时间完成一道编程题的,这里具体说一下题目内容。

给定一个时间段和步长,枚举该时间段内按步长的划分,例如时间段为6:00~9:00,步长为45分钟,那么返回的结果应该是['6:00~6:45', '6:45~7:30', '7:30~8:15', '8:15~9:00']

当时看到题目,想到的是有两种实现方法,一种是通过Date对象来实现,另一种是直接对时间进行加减运算,然后再格式化,下面说一下两种方法的思路。

两种思路都需要先处理的

  1. 分割字符串获取时间段的开始时间和结束时间并保存
  2. 接着再分别保存开始时间和结束时间的小时和分钟
  3. 计算开始时间和结束时间间隔的分钟
  4. 根据间隔时间算出按照步长划分时间段的个数,只计算能完整划分的时间段

Date对象运算

  1. 获取当日的时间,然后分别设置开始时间和结束时间的时间对象,转换成时间戳后计算间隔的分钟
  2. 新建一个时间对象,并设置为当天的0点0分0秒
  3. 遍历可枚举的时间段的个数,在循环体内设置对应时间段的开始时间,然后计算步长与时间段开始时间相隔的分钟,再通过setMinutes设置需要累加的时间
  4. 然后格式化划分的时间段的开始时间和结束时间,push到枚举的结果集内

直接计算

  1. 根据给定时间段的开始时间和结束时间计算间隔的分钟,结束时间的分钟减去开始时间的分钟,再加上小时差乘以每小时60分钟
  2. 遍历可枚举的时间段的个数,循环体内把对应时间段的开始时间保存到对象内,分开保存小时和分钟,计算补偿与时间段开始时间相隔的分钟,进行相加然后保存到结束时间的对象内,最后再格式化对象内的时间,因为对象内的分钟可能大于60,如果大于60就把小时进行+1的操作
  3. 根据开始时间和结束时间的对象做字符串拼接,push到枚举的结果集内

以上就是两种实现的思路,在面试的时候,看到这种时间类的计算,第一感觉就给我是可以使用时间对象来计算,后来发现这种还是挺麻烦的(最后是完整的实现了),回来后实现了直接计算的方式,相对来说更简单(点击查看代码)。还有一个需要考虑性能的问题,这一块回头可以做个测试。