跨越速运面试记

一面

  来的是一位前端组的负责人,年纪和我差不多,满头白发比我还多,一看就平时加班不少,一上来就让我自我介绍下,在现任公司我也有面试官的经历,所以非常能理解(一般都趁这个机会看看简历嘛)我就现任公司情况、我个人主要负责事项、团队的情况和项目的技术背景作了简单介绍。接下来就进入了正式的技术面试细节:

  • 请说一下JS的作用域和作用域链
    头一次见人有这样问问题的,我感觉到比较惊讶,就回复他说:“这个问题比较广泛,我不知道怎么回答你,我简单说一下什么是作用域以及 JS 作用域的类型”。作用域简单理解就是代码在运行的过程中变量的查找规则,而在 JS 中他属于静态作用域也就是词法作用域,代码在编写的过程中就已经确定了,和其他的语言不同,比如 bash 就是动态作用域,我并不打算继续深入讲解什么是用作用域链,因为这牵扯到执行上下文初始化、执行上下文栈以及整个 JS 的解析执行的流程,最后才能解释通什么作用域链的问题。所以回答就到此结束了。下面补充一段代码对比一下静态作用域和动态作用域的区别。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var value = 'hello';
    function bar() {
    console.log(value);
    }

    function foo() {
    var value = 'world'
    bar();
    }
    foo(); // hello
    1
    2
    3
    4
    5
    6
    7
    8
    9
    value=1
    function foo () {
    echo $value;
    }
    function bar () {
    local value=2;
    foo;
    }
    bar // 2
  • 请说一下 JS 里面的 Even loop
    我们都知道 Javascript 是一门单线程语言,什么是单线程简单理解就是在某一时刻只能同时做一件事情,这意味着在代码的执行的过程所有的任务都需要排队,前一个任务结束才能继续执行后一个任务,如果一个任务耗时很长,后一个任务就只能处于等待的状态,效率非常低,为了解决这个问题,把所有任务分成同步任务和异步任务,当遇到同步任务时候添加到执行栈中排队执行,当遇到异步任务的时候添加到任务队列中,等到任务队列通知主线程某个异步任务的时候,把他添加到执行栈中再执行该任务。这个过程会不断的循环,这种运行的机智称为Even loop。如果更细致的区分异步任务又可分为:微任务和宏任务,那么这二者的执行过程形象化的解释就像你去银行排队取钱,排队这个过程就像一个“宏任务”,当排到你的时候,你处理完取钱的业务,柜员会问你还有没有其他业务要处理,如果有柜员会处理继续帮你处理其他的业务,其他的业务就像一个“微任务”,柜员不会让你去重新排队,那么在JS里面也是如此,首先会执行同步代码如果遇到宏任务则将他添加到任务队列里面,如果遇到微任务会线执行微任务,当所有的微任务都执行完毕后才会执行下一个宏任务,如此反复直到程序运行结束。

  • 请说一下模块化
    当听到这个问题我比较尴尬,我不能理解是需要我解释模块化的概念,还是模块化开发的优缺点,或者说常见的模块化的原理,我楞了一下后回答道:“你想让我回答模块化的什么东西?”。他说把你都知道的说出来,后续我简单的说了一下目前模块化的分类:AMD、CMD、ESM以及他们的区别。也没有心情继续下面的面试了(所以说一个会提问会引导的面试官多么重要)

  • 请说一下 Vue js 里面的next tick
    这个问题我回答的不是很好,因为不清楚 next tick 实现的具体细节,所以只是简单说了一下 next tick 使用场景以及为什么会出现这情况。

  • 如果让你来带团队负责一个项目你会怎么做
    首先是框架选型考量,要考察团队成员的技术功底,选择合理能驾驭的框架,其次根据业务发展当前框架能否 HOLD 住需求,然后才是架构层面上的事情,包括开发规范、代码风格、前端工程化等等,最后就是任务分配根据团队成员对业务理解个人技术能力分配任务还有就是项目进度的追踪。

  • 我今天我们的面试你觉得有啥要改变的吗
    我说面试不应该问这个广泛的概念的问题,比如我问:请你解释一下 JS 的原型,其实如果我只是告诉你概念,根本没有啥意义,如果把问题换成:你知道 JS 里面如何实现继承的吗?后续还可以问常见的继承有哪些优缺点?这样会比较好,面试官点了点头,似乎觉得我说的不错。

  • 你怎么看中国的经济
    这个我忘记怎么回答的了

二面

  来的是一位带着眼镜的前端架构师,看着挺腼腆的头发也很多,一进来就问我怎么看待加班的问题,工作这么多年早就司空见惯了,我说我对加班不是很排斥,不赚钱的公司才不加班。他笑了笑然后说我们直接进入面试环节了,我主要考察你原生 JS 的能力。

  • 我有一个不限长度的数组里面存储的异步任务,数组的前一项的运行结果要传给后一项作为参数,请问如何实现这个需求
    我第一反应就是使用异步迭代,他说里面的不一定是 Promise,我心里反嘀咕不是可以 Promise 化吗?然后我又说实现一个类似 co 这种状态机来实现异步迭代,他说我把问题想复杂了,我们主要是为了解决同步任务和异步任务的冲突,我说你的方案是啥呢?面试官说使用递归就行了,实现一个函数他有三个参数:迭代的数组,当前迭代迭代结果,当前的索引。然后问题就到此结束了,面试结束后我请教了我们公司前端大佬,他使用 while 循环配合 promise 解决了这个问题。

  • Element UI Tree 组件性能优化问题
    面试官详细介绍了 Tree 组件的实现过程,然后说当加载同时 1000 个节点的时候会存在性能瓶颈,问我如何解决,我说采用懒加载就能解决了,他说展开以后还是会存在性能问题?我说不会啊,我没有遇到过。他说提示一下这个问题和组件以及 Vue 没有关系,主要是考察原生 JS 能力。我说如何一次性插入 1000 个 DOM 渲染会存在瓶颈我能理解,我们可以采用可视区 DOM 渲染的方法去优化,其他的我没有遇到过。后面面试官直接说是事件绑定的瓶颈,我说应该也不会啊,事件都是异步任务,只有 UI层 面触发才会执行,理论也不会出现性能问题,我说我会再测试,如果是事件绑定的性能问题,可以使用事件代理来解决,后面请教了同事他说如果同时一瞬间绑定1000个事件会产生性能问题,他说这个问题只存在老版本的组件中。新版本的已经优化了,只能说平时的业务场景没有这么多的数据无法接触到。

三面

  三面似乎是部门的负责人,看起来挺年轻的,戴着小眼镜看起来很胖,让我在会议室等了 30 分钟左右他才来面试,一上来就让我自我介绍下,我就按照之前的套路介绍了一下,然后被他多次打断(素质太差了这人),接着问了我看了 Vue 源码没有,我说看过一些,然后我简单和他说了 Vue 是什么框架,最后他居然来一句:Vue 的底层就是 JQuery。我说他们完全不是一个概念,我说 JQuery 是命令式的操作,Vue 是声明式的操作,Vue提供了一套模板语法可以将状态和视图绑定起来,比如 v-if 可以控制 DOM 的隐藏和显示。然后他说 Vue 的组件最后就是函数还是在操作 DOM,我说 Vue 组件经过模板编译之后生成渲染函数运行之后生成虚拟 DOM 最后才是用户界面。似乎面对我两次的反驳他有点不爽,接着又问我 30K 和 40K 的前端有什么区别,你觉得需要满足哪些要求。我说不同的职级的前端对技能要求不同,比如高级和资深的区别除了在代码层面、业务层面考量都不一样。后面他就直接让我走了,说今天的面试到此结束,我把你的情况报告给我们领导。然后我说 OK,就直接走了,没想到我走到电梯门口,他有让我回去说我们领导想让你和 HR 聊聊。

四面

  HR是一个胖胖的女孩,我对她的印象不是很好,不过她本人说话还是特别客气的,她一上来简单问了我为什么离职,然后让我出具工资证明,后面才说我们要根据的上一家的收入给你评估工资,我有点呵呵了,给他看了一下微信公众号的收入通知,后面我就问他们公司的福利待遇,有班车接送、加班工资、弹性打卡、扁平化管理、这些东西对于一个工作几年的人来说不算什么了。后面简单谈了一下工资比我现在的收入还低 1K 但能给到 14 薪,她拿出手机在那算了又算嘴里念念有词会比你现在的高,然后建议我考虑一下,还说目前的疫情关系很多公司都倒闭了,你下周一给我答复吧,因为我们现在也在招人进入一个新的项目比较急。然后我说可以我考虑一下,就和他再见了,结束了今天的面试之旅,下楼后我走到车旁边点上一支烟平静了心情后就开车回家了,关键我出去的时候还缴纳了 16 元的停车费和一份简历打印费,心里骂了一句:sx 公司。