【前端校招面经】小米南京互联网业务部前端23校招一面面经
- 自我介绍
- 在你过往实习的项目中你遇到过哪些问题, 如何解决的
- CSS
position
属性有哪些值, 列举出来其各自的作用
static, relative, fixed, absoluate, sticky
- 口述
https
原理 - CSS 手写一个
两栏布局
- CSS 将页面元素隐藏的方式有哪些
- 浏览器缓存原理
- 手撕代码:
function mySetTimeout(func) {
// 实现该函数, 需要考虑用多种方式解决
}
// 使执行下述代码的输出结果为"1234"
console.log(1);
setTimeout(() => {
console.log(4);
});
mySetTimeout(() => {
console.log(3);
});
console.log(2);
参考答案:
// 方法一: 直接用 Promise
function mySetTimeout(func, ...args) {
const _this = this;
return Promise.resolve().then(() => {
func.call(_this, ...args);
});
}
// 方法二: 利用 async await
async function mySetTimeout(func, ...args) {
await 0;
func.call(this, ...args);
}
- 手撕代码: 用
TypeScript
实现防抖/节流, 要求用 ts 的泛型机制控制防抖与节流函数的参数与返回值类型相同 参考答案:
// 这里的 ts 泛型限制参考了 lodash
function throttle<T extends (...args: any[]) => any>(
fn: T,
delay?: number
): (...args: Parameters<T>) => ReturnType<T> | void {
let flag = true;
return function (...args) {
if (!flag) {
return;
}
flag = false;
setTimeout(() => {
fn(...args);
flag = true;
}, delay ?? 0);
};
}
- 手撕代码: 给定一个乱序数组, 假设该数组中有一个元素的出现次数超过了数组长度的一半, 需找到这个元素, 要求
时间复杂度为 O(n) 且空间复杂度为 O(1)
- 手撕代码: 给定一个只包含 6 种括号字符的字符串, 检查其括号是否能够匹配
反问环节:
- 部门原来在北京, 22 年开始大规模迁移到南京
- 业务线涵盖 B/C 端, 主要包括游戏业务(C端), 面向商城的运营(B端)
- 面试官自己评价说"本人涉及的工作内容没有什么技术难度"
- "预计你来这里以后, 业务压力会比较大"
- "去年做了好些同质化的业务", "技术在南京但产品团队在北京, 因此沟通上会有一些额外的压力"
- 面试官提到这边的价值观: 与其质疑产品提出的需求的价值, 不如考虑自己如何提升和扩宽业务的价值
- "这边的产品没有你想象当中那样专业, 因此需要技术去帮产品考虑业务赋能问题, 需要你主动提出一种模型然后和产品去介绍沟通"