这个面试机会来的挺意外的,先在 Boss 投递的简历,后再牛客网看到了内推人的微信,加了微信问了下进度,挂了,内推人给我打电话根据简历简单询问了一下情况(内推人很谦逊,毕业于一所 211 大学,和我说他的学历也很一般),然后和 hr 沟通捞了我一下,才有的这个面试机会,太感谢了。
一面
6 月 9 日 16:00
- 自我介绍
- 怪异盒模型和标准盒模型的区别
- 给了一段代码说两个盒子背景为蓝色的区域
- 两个盒子分别设置了 box-sizing: border-box, box-sizing: content-box
- 如何触发 BFC
- 给一段代码问效果是什么样的
- 会有一个外边距合并的问题,怎么解决这个问题
- 垂直水平居中
- 你了解得数组遍历方式有哪些,你觉得那个性能最优那
- this 指向谁,如何更改 this 的指向
- // 非原题 非原题 非原题 const o1 = { text: 'o1', fn: function() { return this.text; } } const o2 = { text: 'o2', fn: o1.fn } console.log(o2.fn());
- 你常用的 React Hooks 有哪些,描述功能
- 打出来
- 服务端渲染了解吗 和 SPA(单页面应用) 的区别
- Commonjs 和 ES6 Module 得区别
- 还了解过其他的吗,不了解(AMD、CMD、UMD...)
- 算法题
- 题不难,但是思路跑偏了
- 先用的递归O(n ^ 2)
- 可以优化一下吗?
- 改成了循环可以提前终止
- 面试官: 其实你思路跑偏了,O(n)的复杂度就可以,用栈(瞬间顿悟),不过解出来就好
- 反问
大概 45 分钟吧
说一面就给我过了,等会 17:00 二面
二面
- 讲讲项目,说说你的亮点
- 亮点,性能优化吧,怎么测量的,怎么优化的,优化前后的对比
- Network, Lighthouse, Performace, Memory, Webpack、网络
- 面试官也会提出一些问题,问我怎么优化,原理是什么
- 有写过 webpack 的 plugins 吗
- 没有
- 看代码,css 选择器权重
- 算法:二叉树
- 考点递归回溯,非原题
- 有这么一个数据结构: const data = [ { "id": "1", "sub": [ { "id": "2", "sub": [ { "id": "3", "sub": null }, { "id": "4", "sub": [ { "id": "6", "sub": null } ] }, { "id": "5", "sub": null } ] } ] }, { "id": "7", "sub": [ { "id": "8", "sub": [ { "id": "9", "sub": null } ] } ] }, { "id": "10", "sub": null } ] 现在给定一个id,要求实现一个函数 findPath(data, id) { } 返回给定id在 data 里的路径 示例: id = "1" => ["1"] id = "9" => ["7", "8", "9"] id = "100"=> [] PS: id 全局唯一,无序 ```
- 说下 EventLoop
- 看代码
- 非原题
- async function async1() { console.log('async1 start'); await async2(); console.log('async1 end'); } async function async2() { console.log('async2'); // 注意:这里如果返回 Promise 的话执行顺序就不一样了 } console.log('script start'); setTimeout(function() { console.log('setTimeout'); }, 0) async1(); new Promise(function(resolve) { console.log('promise1'); resolve(); }).then(function() { console.log('promise2'); }); console.log('script end');
大概 40 分钟吧,等会 18:00 三面
三面
- 自我介绍
- 几几年的
- 哪里人啊
- 高考是出现了什么状况吗
- 没有啊,就是当时没那个想法
- 这个学历对你产生了多少影响
- 还是聊聊技术吧,给一个场景,二分查找
- 写出来了
- 你还能在优化一下吗
- 额,时间复杂度O(logn), 空间复杂度 O(1),这挺优的啊(有点懵)
- 不,这个优化不止是时间和空间复杂度,可以从工程化的角度出发
- 还是有点懵
- 提点了我一下(l 和 r 为什么要定义在外面)
- 哦哦,关联太多,所以耦合就高,您是指的这个吗(没回复)
- // 当时用的 js,用 ts 只是为了表达的更清晰一点 interface Barrage { time: Number; barrage: String; } const binarySearch = (arr: Barrage[], time: number) => { let l = 0; let r = arr.length - 1; while (l <= r) { const mid = (l + r) / 2; if (arr[mid].time === time) { return arr[mid].barrage; } else if (arr[mid].time < time) { l = mid + 1; } else { r = mid - 1; } } return null; }
- 那数组的边界
- 我就在那看,看了大概十几秒吧,会越界吗...
- 面试官:好吧,那我们先下一题
- 一个异步任务调度器,最多同时执行两个异步任务
- 有思路吗?
- 用个数组先存起来,判断执行的数量,需要就取出来,
- 好,那你写吧
- 结果写了好久,半个小时起步,还没写出个结果
- 执行逻辑大概写出来了,但返回的逻辑没写出来
- 提点我一下,我