背景
最近在休假,趁有点时间就想着去别的单位面试,主要是想了解下现在对前端岗位的要求,避免自己长时间处于一个温水煮青蛙的状态,尤其是前端技术日益更新,如果没有持续学习很有可能就要被淘汰了。(出于尊重面试单位目的,在这里就不透露面试单位的名称了)
下面就来说说最近面试都遇到什么问题,最近去了几家单位面试,面试中问的也是多种多样
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
对象来实现,另一种是直接对时间进行加减运算,然后再格式化,下面说一下两种方法的思路。
两种思路都需要先处理的
- 分割字符串获取时间段的开始时间和结束时间并保存
- 接着再分别保存开始时间和结束时间的小时和分钟
- 计算开始时间和结束时间间隔的分钟
- 根据间隔时间算出按照步长划分时间段的个数,只计算能完整划分的时间段
Date对象运算
- 获取当日的时间,然后分别设置开始时间和结束时间的时间对象,转换成时间戳后计算间隔的分钟
- 新建一个时间对象,并设置为当天的0点0分0秒
- 遍历可枚举的时间段的个数,在循环体内设置对应时间段的开始时间,然后计算步长与时间段开始时间相隔的分钟,再通过
setMinutes
设置需要累加的时间 - 然后格式化划分的时间段的开始时间和结束时间,push到枚举的结果集内
直接计算
- 根据给定时间段的开始时间和结束时间计算间隔的分钟,结束时间的分钟减去开始时间的分钟,再加上小时差乘以每小时60分钟
- 遍历可枚举的时间段的个数,循环体内把对应时间段的开始时间保存到对象内,分开保存小时和分钟,计算补偿与时间段开始时间相隔的分钟,进行相加然后保存到结束时间的对象内,最后再格式化对象内的时间,因为对象内的分钟可能大于60,如果大于60就把小时进行+1的操作
- 根据开始时间和结束时间的对象做字符串拼接,push到枚举的结果集内
以上就是两种实现的思路,在面试的时候,看到这种时间类的计算,第一感觉就给我是可以使用时间对象来计算,后来发现这种还是挺麻烦的(最后是完整的实现了),回来后实现了直接计算的方式,相对来说更简单(点击查看代码)。还有一个需要考虑性能的问题,这一块回头可以做个测试。