记得之前自己的主管就反复说学习工作需要有输出,可是终究是一时兴起,没有坚持去做。所以,从2020.9.4开始,自己坚持偶数天写一篇文章。
个人背景
自己刚开始是以测试外包的形式进入大厂,做了一年多,运气好,转大厂正职了。大厂一方面是大,另一方面是边缘部门管理简单粗暴,自己的前两任主管都很少见面,第三任主管不喜欢管事,第四任主管也就是转大厂正职后的主管,也不怎么喜欢管理。而测试一般是安排到项目组的,虽然项目组 leader 很强,把团队拉起来,可是测试毕竟是其他部门,自然较少顾及,于是自己就开始“野蛮生长”。直到今年4月项目组解散,能力强的人各奔东西,而看看自己,发现还是少用成长,非常恐惧,于是在月末离职了。
裸辞时期
有一个学习的打算,没有想去达成的目标,于是裸辞这段时间非常的漫长。刚开始想学点东西,到了第三个月底想回大厂,于是开始学 Vue 源码,这样大概过了两三周。
重新找工作
8月10日开始投简历,刚开始很自信,后来发现简历都石沉大海,不得不说自己写简历这方面能力很弱,可能需要按照一位大牛说过的那样,写简历弱的人需要花点钱找人代写。可是当时自己不知道,后来居然冲动的开始了海投。一直到了第三周才接到了面试邀约,断断续续面试了7家。刚开始两天面了四家,那个累啊!后来就一周面试了3家。收到一个 offer,由于觉得自己离职时间太长了,最后决定还是接了这个 offer 。总结,之后再找工作的话,一到两个月稳抓基础,多做题,多背知识点,最好是将所有的知识点都能够连接起来,然后最少要花一个月的时间多面几家公司。
前端面试题总结
初创型:强调直接上手能力。有技术面+HR 面,视频面(强调数据结构,一面就挂了)
- Vue 题型:Vue 性能优化,指令,响应式原理,Vue 的生命周期,computed、watch、method 三者的区别,父子通信的方式,路由守卫
- 数据结构:红黑树,单链表
发展型:笔试(有现场和远程笔试两种)+技术面+HR 面,电话面(强调基础,一面就挂了)
- Javascript 题型:arguments,迭代,for…in 和 for…of 的区别,判断数组的方法,闭包 ,内存泄漏,垃圾回收,原型链,instanceof 原理,手写全选部分选反勾选组件,手写 call、apply、bind,手写 instanceof,递归实现1+…+100,var、let、const 的区别,冒泡事件流
- CSS 题型:隐藏元素的方法,回流和重绘,水平垂直居中,盒子模型,实现单词首字母大写,px、rem 和 vm 的区别。用 CSS (不用定位和浮动)实现布局:一个 div1,里面放5个 div,其中一个 div 在 div1 的中间,另外4个 div 分别在 div1 的四个角
- Vue 题型:项目开发中在什么场景用到计算属性,vuejs 如何做数据缓存,使用 vuejs 开发项目,一般会在那个生命周期下发送 ajax 请求,父子组件如何相互调用方法、为什么是单向数据流,封装组件的方法,优化性能的方式
- 网络:从输入 URL 到显示页面的过程,三次握手的过程
- 浏览器:存储,跨域
- 功能场景:上传文件,长列表加载,实现省市区联动效果
算法题
1. 10到100之间的随机整数
function fn(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
console.log(fn(10, 100));
2. 封装函数,实现功能 var obj = { a: 1, b: { a: 2, b: 3 }, c: 3, d: 4, e: { a: { b: { c: 4 } } } };,console.log(fn(obj)) [1,2,3,4]
var obj = { a: 1, b: { a: 2, b: 3 }, c: 3, d: 4, e: { a: { b: { c: 4 } } } };
function fn(obj) {
let ans = [];
function calculate(obj) {
for (const key in obj) {
const value = obj[key];
if (value) {
if (value instanceof Object) {
calculate(value);
} else {
if (ans.indexOf(value) === -1) {
ans.push(value);
}
}
}
}
}
calculate(obj);
return ans;
}
console.log(fn(obj));
3. 封装一个函数,实现发送 ajax 请求 ajax({url:’xxx’,method:’post’}).then() (默认使用 get 请求)
function ajax(options) {
const url = options.url;
const method = options.method || "get";
const xhr = new XMLHttpRequest();
return new Promise((resolve, reject) => {
if (method === "get") {
xhr.open(method, url);
xhr.send();
} else if (method === "post") {
xhr.open(method, url);
xhr.setRequestHeader(
"Content-Type",
"application/x-www-form-urlencoded"
);
xhr.send();
}
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
result = xhr.responseText;
resolve(result);
} else {
reject(xhr.status);
}
}
};
});
}