高途前端面试

2,203 阅读5分钟

一面

状态:通过

1. 开始一直在聊项目

2. 变量提升的原理

原理:JS引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再运行,也就是预处理和执行两个阶段
变量提升的定义:所有变量的声明语句都会被提升到代码头部,这就是变量提升。

var的变量提升的底层原理是什么?

3. 作用域和作用域链 AO 和 GO

执行上下文、Closure(面试版)

4. 如何做好垃圾回收

v8的垃圾回收分代式、内存互换、晋升老生代、老生代标记清除法,标记压缩清除法
垃圾回收机制

5. 算法:找出所有的路径

提示:如果节点在树内,一定会找到根节点

const list = [
    {id: 6},
    {id: 2, children: [5]},
    {id: 13},
    {id: 5, children: [10, 11]},
    {id: 1, children: [2, 3, 4]},
    {id: 10},
    {id: 8, children: [13]},
    {id: 4, children: [8, 9]},
    {id: 9},
    {id: 3, children: [6, 7]},
    {id: 11, children: [14]},
    {id: 14},
    {id: 7, children: [12]},
    {id: 12}
];
function getPaths(list) {

    // 找到所有的叶子结点
    const leaf = list.filter((item) => !item.children);

    const getParent = (list, cur) => {
        return (list.find(item => item.children.includs(cur)) || {}).id;
    }
    const res = [];
    for(let i = 0; i < leaf.length; i++) {
        const curId = leaf[i].id;
        const path = [curId];

        let parentId = getParent(list, curId);
        while(parentId) {
            path.unshift(parentId);
            parentId = getParent(list, parentId);
        }
        if(path.length > 1) {
            res.push(path);
        }
    }

    return res;
}

二面

状态:通过

1. 自我介绍

2. 前面说了三个项目,你觉得的最有挑战的是那一个?

3. 面试官说其实他以前不是前端,所以问我怎么评估前端的价值

4. 如何说服对方接受自己的建议或者观点

(因为我在前面的聊天中说到了我们如果发现交互不合理的地方应该主动和PM等的沟通)

5. 如何评估C端用户的用户体验

我说了AB实验

5. 上面说AB实验,被继续追问,我具体会怎么设计实验,以及具体如何评估

6. 你大学专业不是计算机专业吧,那你有系统的学习计算机原理等吗?

不是,说实话是没有的,但是前端相关的知识我会有意识的学习的

7. 那你知道TCP三次握手吗?简单介绍下,你觉得这个知识点会用到吗?

知道,简单介绍了一下。  
会呀,比如我项目中的性能优化的prelink,就是提前与服务端建立连接。 

8. 知道数组的快速排序吗?知道哪些?

知道,但是只记得一些,让我全写出来,我肯定是写不出来的,我自己也会去leetcode上练习一些算法题 比如:快速排序、冒泡排 序啥的(怕面试官让我写,所以没多说)

9. 你平时是怎么学习的呢?

我会逛一些社区,比如掘金、思否等,还会看MDN上的,正打算忙完这段时间去学习chrom提供的关于渲染方面的知识

10. 那你说在你最近学习到的一个比较有趣的知识吧?

我简单阐述了下 MDN中闭包的定义,以及我自己觉得有趣的点在哪儿

11. 那你觉得这个闭包在我们实际有什么应用吗?

我简单举了一个 累积操作 的内容获取,利用闭包可以优化性能啥的

12. 在现在公司不到2年,问我为啥要换工作

第一次跳槽是想去大厂看看 这次,虽然我很享受在xx的时光,也感谢同事们对我的照顾,但是我正在追求新的挑战,更好的发展机会。

三面

因为我的职级和薪资的问题,所以hr说增加面试一轮,我也同意了。三面整体时间比较短,就聊了10多分钟。
状态:通过(应该是通过的,hr隔了一个星期,说打电话和我聊聊)

1. 自我介绍

详细回答:参照字节面试

2. 一些关于性能优化的事儿

详细回答:参照字节面试

3. 负责的项目有多少人?是你主导吗?

2个前端,主导;整个业务方向有3个产品、5个后端、4个测试(分前后端)还有设计通许,都属于不通的部门

3. 问了我的学习计划

感觉自己面试的时候回答不是很好,答案是面试后整理的。

  1. 就现阶段,我需要找工作,但是我还在职,首要的肯定是做好工作
  2. 其次我需要换工作,肯定是会学习一些面试相关的
  3. 换完工作后,打算进一步学习一些原理性的知识,比如V8的渲染
  4. 打算在今年经营好我的掘金账号(这儿可以举例话说明下),比如从我准备面试到现在,已经累计发文60篇,当然现在其中很多不是原创,后序会进行一些原创文章的撰写。
  5. 还有就是对自己算法能力和编码能力的持续提高,如通过leetcode,还计划后续参与一些git开源项目

4. 前年、去年绩效,现在的职级

xx, xx , xx

5. 对offer有啥期望(公司、行业、团队)

相对公司和行业,我这次跳槽可能会看中团队方面,希望是一个携手共同进步,往前推动项目完成,下来也可以是朋友的关系。

6. 提问:请你是我现在面试团队的TL吗?

面试官:是
我:你应该知道我是三面吧,所以问下。

7. 提问:现在团队有多少人呢?(面试官给我解释了现在团队主要负责业务)

面试官:把整个公司的业务都大致介绍了下,然后说下他主要负责教培(三大块)这个方面,然后介绍了(大约讲了10分钟吧)

8. 提问:如果我有幸进入公司,主要是做什么呢 ?

面试官:应该也是教培三大块之一,可能都不会太喜欢会的和重复的工作,所以进来后会根据人进行调整,现在没法告诉你具体。