广州前端面试记(初级)

433 阅读4分钟

   记得之前自己的主管就反复说学习工作需要有输出,可是终究是一时兴起,没有坚持去做。所以,从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);
              }
            }
          };
      });       
}