一面(10.28,1小时)
上来先问了问成绩、平时看哪些博客
口头提问
- HTTP请求的类型有哪些?
- HTTP报文组成部分
- HTTP常见header
- 前后端如何交互
- 登录逻辑(用户身份验证)
- cookie常用字段
- cookie、sessionstorage、localstorage
- 什么是跨域?如何解决跨域问题(提到CORS,CORS过程,简单请求和复杂请求,浏览器发送请求)
- 原型链(先手撕一道继承代码题,然后问了一些原型链的问题)
手撕代码
【手撕代码部分】
题目一:css用flex水平垂直居中
题目二:判断数组
题目三:api.get()是一个异步函数,会从服务端异步请求数据(number),返回一个Promise
function fetchData() {
let data = -1;
api.get('/api/data')
.then((i) => {
data = i;
})
.catch((e) => {
console.log(e);
});
return data;
}
题目四:把setTimeout改造成Promise的sleep函数
// 函数签名
function sleep(second);
// 实现10秒之后打印“10”
sleep(5).then(i => { console.log(i)});
题目五:原型链的继承,实现构造函数B继承于A,
构造函数A
- 函数签名:const a = new A(name);
- 实例属性name // 字符串
- 原型对象属性有一个run方法
- function () { console.log(`${this.name} run`); }
构造函数B
- 函数签名:const b = new B(name, email);
- 实例对象拥有A的所有实例属性
- 实例对象自定义一个email属性 // 字符串
- 原型对象继承于A
- 原型对象上自定义一个swim方法
题目六:数组扁平+数组去重+排序
var arr = [ [ 2, 1, 2], [3, 4, 5, 5], [ 7, 8,6,9, [11, 12, [12, 13, [14] ] ] ], 10];
编写一个程序将数组扁平化去并除其中重复部分数据,最终得到一个升序且不重复的数组
二面(10.29,1小时)
二面先聊项目,然后面试官提了几个问题,让我手撕代码
- 介绍项目难点,提到用户权限控制,用到动态路由加载以及如何改进
- vue2.0和3.0双向数据绑定,怎样为data添加数据
- 知道的排序算法,稳定性,时间复杂度
手撕代码
题目一:给定一个二叉树,返回所有从根结点到叶子结点的路径
function allPath(root){
var res = [];
if(!root) return res;
function getPath(root, arr){
var a = [...arr];
if(root){
a.push(root.val);
if(!root.left && !root.right){
res.push(a);
}else if(root.left){
getPath(root.left, a);
}else if(root.right){
getPath(root.right, a);
}
}
}
getPath(root, []);
return res;
}
算法二:找到数组中第K大的元素,我用了一个快速排序,leetcode215:https://leetcode-cn.com/problems/kth-largest-element-in-an-array/
function sortQuick(arr, left, right){
var cur = arr[left];
while(left < right){
while(left < right && arr[right]<=cur){right--;}
arr[left] = arr[right];
while(left < right && arr[left]>=cur){left++;}
arr[right] = arr[left];
}
arr[left] = cur;
return left;
}
function sort(arr, low, high, k){
if(low<high){
var index = sortQuick(arr, low, high);
if(index-low+1 == k){
return index;
}else if(index-low+1 > k){
sort(arr, index+1, high, k);
}else{
sort(arr, low, index-1, k);
}
}
}
算法三:实现一个树形导航栏组件
三面(10.29,1小时)
- 进程与线程区别
- MySQL单例模式
- 平时怎么学前端
- 实习时做的项目里的数据走向
- 算法题:javascript 实现一个带并发限制的异步调度器,保证同时最多运行2个任务(写了半天没写完,面试官说算了)
class Scheduler {
add(promiseCreator) { ... }
// ...
}
const timeout = (time) => new Promise(resolve => {
setTimeout(resolve, time)
})
const scheduler = new Scheduler()
const addTask = (time, order) => {
scheduler.add(() => timeout(time))
.then(() => console.log(order))
}
addTask(1000, '1')
addTask(500, '2')
addTask(300, '3')
addTask(400, '4') // output: 2 3 1 4
// 一开始,1、2两个任务进入队列
// 500ms时,2完成,输出2,任务3进队
// 800ms时,3完成,输出3,任务4进队
// 1000ms时,1完成,输出1
// 1200ms时,4完成,输出4
HR面(10.30,半小时)
- 前面三面的面试感受
- 实习主要做了什么,有哪些收获?
- 实习时候除了导师和leader给的任务,会做其他事情吗?
- 职业规划
- 为什么选择做前端
- 通过哪些手段纵向提高技术能力
- 提前批面试失败了,这次有什么提高吗?
- 收到哪些offer或者还有什么流程内的公司
- 为什么投了xxx公司(拿了offer的公司)
- 选择岗位的标准
- 介绍了加班情况,能不能接受
能想起来的题目是这些,没想起来的后面慢慢补充,许愿offer
全部评论
(11) 回帖