update : 2021-2-19 13:22:47

阅前提示:这是一次失败的面试经历 :-1:,可作为参考

凉凉

2021 - 01 - 26 电话面试

1 月 22 号接到 HR 的电话通知简历过筛,约定于 26 号电话面试。

1 月 26 号下午 5 点(极其准时)第一次电话面试,内容如下(有记忆的):

  • 自我介绍
  • 为什么要学前端,平时是怎么学前端的
  • 会什么前端技术
  • 有什么前端框架的使用
  • 算法的掌握情况
  • ...

15min左右,聊得很开心。

2021 - 02 - 18 视频一面

2 月 17 号 HR 告我准备视频面(还发了一堆前端资料给俺,简直良心),然而第二天(18 号)就要面试根本来不及看...

2 月 18 号下午 3 点 视频一面,使用的方式是牛客,面试官是个前端小姐姐,内容如下(有记忆的):

  1. 自我介绍

  2. 怎么理解MVC

  3. ECMAScript6语法新特性

    //A:模板字符串、扩展运算符、箭头函数、promise对象(我tm就不该说这个)
  4. 你说了promise对象,说一下这段代码输出并解释一下

    console.log('start');
    setTimeout(() => {
    console.log('setTimeout');
    }, 0);
    const promise = new Promise((resolve, reject) => {
    console.log('promise1');
    resolve();
    console.log('promise2');
    reject();
    });
    promise.then(() => {
    console.log('promise3');
    }).catch(() => {
    console.log('promise4');
    })
    console.log('end');
    
    //我TM直接裂开,直接坦白不会,,
  5. 手撕代码 :数组去重

    const arr = [11,12,13,11,13];
    
    //自己写的笨办法
    const remove = (arr)=>{
    let length = arr.length;
    let stack = [];
    for(let i = 0;i < length;i++){
        if(stack.indexOf(arr[i]) === -1){
            stack.push(arr[i])
        }
    }
    return stack;
    }
    
    console.log(remove(arr));
    
    //Q:有没有其他的解决方案
    //A:记得有个api可以直接调用返回 filter
    //Q:用法还记得嘛
    //A:(再次裂开)忘了。。。
    //Q:还有Set用没用过
    //A:(无敌裂开)是ES6新特性,但没用过
    
  6. CSS 的定位方式,分别是怎么偏移的

    //回答偏移的时候absoulterelative说反了,我tm还自信满满
  7. 解释一下 Flex 布局

    //A:flex容器和flex元素,容器的排列方向和元素的grow,shrink,basis的含义
  8. 从浏览器输入url到渲染是怎么个过程

    //A:url->dns->服务器解析请求->页面传递
  9. 解释一下 TCP 的三次握手,浏览器是怎么渲染

    //A:解释seq,ack报文的传递以及浏览器渲染得三棵树(DOM,CSS,渲染树)
  10. 常见的请求有哪些,常见的报文头有哪些

    //A:get put post delete...报文头有content-type(我接触最多的就只有这个),其他的不会
  11. 常见的状态码

    //A: 200 400 500 404 300
  12. 有哪些方式会导致网页重定向

    //A:(再次裂开,接触太少了)应该有HTTP缓存,,
  13. 解释一下 HTTP 缓存机制

    //A:解释强缓存,协商缓存,304 ,报文头 Cache-Control
  14. let ,const, var 的区别,定义提升,块级作用域

  15. 手撕代码 :弹幕定位

    //一个对象数组,对象类型为
    let obj = {
        time:number,
        value:String,
    };
    //如何快速定位弹幕位置
    //A:直接二分查会不会很快
    //Q:(笑)那你说说二分的条件
    //我直接就懵了,后来在提示下想起必须是有序的,然后面试官改题目为按时间排序
    
    const objArr = [{time:1,value:10},{time:2,value:11},{time:3,value:12}];
    
    conset find = (obj,key){
        let low = 0;
        let high = obj.length - 1;
        while(low <= high ){
              let mid = parseInt((high + low)/2);
              if(obj[mid].time === key){
                  return mid;
              }else if(obj[mid].time > key){
                  low = mid + 1;
              }else if(obj[mid].time < key){
                  high = mid -1;     
              }else {
                  return -1;
              }
        }
        return -1;
    }
    console.log(objArr[find(objArr)].value);
    
    //大概写了5分钟左右,面试官问你这是找了一个但如果我有多个相同时间的弹幕,全找出来怎么做
    //(孩子一下就懵了,其实就是分治找边界,就是想不到,二分也是分治,gan)
    //讨论了一下时间空间复杂度

耗时接近 50 min,和面试官讨论完弹幕问题后,小姐姐直接告我一面过了,让我等一会开始二面。

2021 - 02 - 18 视频二面

大概 10 min 后二面就开始了,二面的面试官就是电话面我的,从头发就看出来是个无敌的大佬,和大佬交流就感觉自己无比的菜,所以内容记得不多:

  1. 前端了解的知识

  2. 手撕代码:找到一棵树上的最大路径的和

    let obj = {
    value:number,
    node:node,
    }
    
    //当时思路是DFS + DP (bad idea)
    //在深度优先搜索的基础上通过DP状态转移方程减少值运算,但卡在找不到状态转移方程,只能在上面写了一个DFS算法
    //15min的时候面试官不断的摸着脑袋,然后我就放弃了,和面试官说了说自己的想法,然后面试官把题目改成找到这棵树的所有值之和。
    面完在 leetcode 上找到了这道题 https://leetcode-cn.com/problems/binary-tree-maximum-path-sum/
  3. 手撕代码 :找到树上所有节点值之和

    //这道题就很easy
    //在上一道 DFS 的基础上把所有节点值加起来就行,这个办法可以跑通,但比较复杂
    let problem = [];
    
    const dfs = (tree)=>{
       let nodes = [];
       if (tree.node != null) {
           let stack = [];
           stack.push(node);
           while (stack.length != 0) {
           let item = stack.pop();
           nodes.push(item.value);
           let children = item.node;
           for (let i = children.length - 1; i >= 0; i--)
               stack.push(children[i]);
           }
       }
       return nodes;
    }
    
    const result = ()=>{
       let result = dfs(problem);
       let sum = 0;
       for(let i=0;i
    leetcode 有很多类似的题目 938题,112题,129题,...
  4. 页面拖拽事件

    //我见都没见过这个,真胡言乱语瞎答,说什么修改width....真小丑没跑了
    面后查到 是 **drop** 属性 arget.addEventListener('drop',func )
  5. 假设某一属性有n个计量单位,最少保存计量单位转换所需的空间

    //A:是不是用有向图保存 这样是 2n 个
    //面试官居然说你大脑换算单位用图啊
    //讨论了半天,最后回归到了一个环(gan,这还不是图)也就是 n
  6. 怎么看待前端工程化

  7. 有关webpack的问题(没问loader很出人意料)

  8. 数据库第一范式,设计和范式的关系

  9. 有什么想问的,以及给了我一堆建议,比如说赶紧学VUE....

二面历时将近 60 min,然后什么信息都没给我,,,就,,结束了......

总结

19 号上午收到了字节发来的面试评价,问了一字节老哥,说收到评价没通知大概率是凉了

尽管没通过,但还是先吹一波字节,面试官是真不错,态度都十分不错,尤其是一面的小姐姐,同时字节的效率也是真滴高。

最后有关 前端 面试建议如下:

  1. 公司与公司之间的差距太大,千万不要小看字节,,,
  2. 面试过程千万不要给自己挖坑,,,面试一定要说自己会的,,,
  3. 好好学基础,目前来说前端最基础的就是 ES6 语法,当然也可以学习 typeScript 语法,css 感觉也挺重要的
  4. 多看书,多实现效果(说好的要看完 《ES6标准入门》 看了两章就吃灰了)
  5. 必须掌握一种框架,可以是 MVVM 框架 也可以是 VUE,那位老哥说大概率凉在框架上了。
  6. UI 库也得掌握一种 bootstrap 是最基础的,多尝试 santd 或者 elementUI 这些第三方组件库
  7. leetcode 一定要刷 hard 级别,我基本上 hard 难度都忽略了。。
  8. 数据结构,计算机网络,操作系统,这三门课的知识千万不能忘!

With great power there must come great responsibility.