一面
上来两道手撕题:
Moka 手撕题
/**
* @param {{start: number, end: number}} first - 第一个区间
* @param {{start: number, end: number}} second - 第二个区间
* start end 是number 且需要考虑 小数情况
* @return {boolean} 是否有交集
*/
function isOverlapped(first, second) {
// TODO
}
// test case
const a = { start: 3, end: 5 };
const b = { start: 9, end: 10 };
const c = { start: 4, end: 6 };
const d = { start: 5, end: 8 };
const e = { start: 1, end: 6 };
const f = { start: 5, end: 7 };
const g = { start: 1, end: 3 };
const r1 = isOverlapped(a, b);
const r2 = isOverlapped(c, d);
const r3 = isOverlapped(d, e);
const r4 = isOverlapped(f, g);
console.log(r1, r2, r3, r4); // false true true false
/**
* @param {Range[]} intervals - 若干个区间
* @return {Range[]} 合并后的区间
*/
function merge(interval) {
// TODO
}
// test case
const f = [
{ start: 3, end: 5 },
{ start: 9, end: 10 },
{ start: 4, end: 6 },
{ start: 5, end: 8 },
{ start: 10, end: 12 },
{ start: 11, end: 14 },
];
const g = [
{ start: 4, end: 7 },
{ start: 6, end: 9 },
{ start: 1, end: 3 },
{ start: 8, end: 10 },
];
const h = [
{ start: 4, end: 7 },
{ start: 9, end: 10 },
{ start: 7, end: 9 },
];
console.log(merge(f)); // [{start: 3, end: 8}, {start: 9, end: 14}]
console.log(merge(g)); // [{start: 1, end: 3}, {start: 4, end: 10}]
console.log(merge(h)); // [{start: 4, end: 10}]
提问
- JS 的事件循环机制
- let const var 区别
- 普通函数和箭头函数有什么区别
- 怎样改变 this 指向
- box-sizing 控制什么的
- 回流和重绘的区别
- React Fiber 的原理
- hooks 写法的优势和缺点
- React Router 怎么控制路由(path)(介绍 hash 和 history)
- hooks 和 函数式组件怎么做渲染上的优化
- 前端如何控制 http 缓存
- webpack 有做过配置吗(我说没有,我只用过 Vite)
- Vite 为什么要比 Webpack 快(Vite 的热更新怎么做的)
- ts 泛型用在什么情况
- 介绍一下重载
- unknown 和 never 的区别
- 后面让我介绍了一下 Electron 里面用到了 Node 哪些东西
二面
整体上都是在围绕你的项目展开的一些问题:
- vue 和 react 的区别
- 了解过微前端吗
- 什么是 CI/CD
- 知道 monorepo 吗
- ts 的 infer 了解过吗
差不多好像是这些,剩下的都是问项目中如何解决问题之类的
二面过完晚上 hr 打电话约我 hr 面了,第二天 oc。