一面 9.14 1h+
var result = [];
var a = 3;
var total = 0;
function foo(a){
for(var i=0;i<3;i++){
result[i] = function(){
total += i*a;
console.log(a,i,total)
}
}
}
foo(1);
result[0]() //3
result[1]() // 6
result[2]() // 9
- 对作用域的理解(上一题做错了所以函数作用域这里理解的不太对
- 对闭包的理解,使用场景
- 手写Promise.all
- 手撕题:括号匹配如果括号匹配错误输出error,匹配成功输出所有在()中的内容。输入:((2+3)+(3*4))+2
- 工作中遇到的问题
反问:
自研canvas框架,负责飞书表格
二面 9.21 1h+
多半凉了感觉没啥问的就做题了
- 自我介绍
- 项目中使用了Vite,Vite做了哪些事(初始化,热更新,打包,代理服务器)
- Vite打包主要做了哪些事?❌
- 打包后为什么要分成多个chunk
- 在浏览器中如何读取缓存,怎么确定是哪个缓存❌
- 强缓存和协商缓存说了一些,还是没有理解上一个问题
- 使用vue-router做了什么,使用的单页面还是多页面
- vue-router实现单页面的原理
- 刷新页面的时候如何保证不会404,history的情况下后端应该做什么配置(返回对应的html文件)
- vue从数据变更到界面变化会经历哪些过程(双向绑定+diff)
- node.js是怎么把js跑在服务端的,由什么组成的?❌
- 开始做题
a. 给定一个非递减排列的数组nums,和一个目标数值target,判断target是否是nums的主元素,是则返回true,否则返回false。主元素的定义是:在数组中出现的次数严格大于数组元素个数的二分之一。
输入:nums = [1,2,3,4,4,4,4,4,4,5,6] ,target = 4
输出:true
说思路:
- 刚开始没看到非递减,说了用哈希的思路
- 面试官问了时间复杂度和空间复杂度看到了非递减,计算target的开始位置和结束位置来计算
- 进一步优化,使用二分查找开始和结束位置
b. 括号匹配(真的好爱出括号匹配啊做了好多种了)
输入一个由小写字母a-z以及左括号(和有括号)组成的字符串s,尽可能少的删除括号,使得字符串中的括号匹配,返回删除括号后的字符串。(输出不唯一)
输入:s = “a(b(c(de)fgh)(((bb))”
输出:“a(b(cde)fgh)((bb))”
思路:栈负责括号匹配,记录括号下标,右括号匹配过程中做删除,遍历字符串后如果栈不为空则删除多余的左括号。(删除方式被面试官提醒了一下)
没反问啥
三面 10.9 30min+
面试官人好好,很和蔼
- 自我介绍
- 实习
- 响应式原理,diff算法
- 手写题:版本号比较
- 论文相关,什么时候能实习
- 还要哪些正在流程中
反问
还有一轮技术面+hr面
又没了解业务啊啊啊呜呜呜
学习webpack—尝试做个插件
四面 10.17 50min+
- 自我介绍
- 项目相关:验证码,如何防机器人(答得不好),划词细节
- 高亮显示使用的css样式
- 微信扫码登录流程
- token如何传递,前端拿到后如何处理
- 博客项目相关,就随便聊聊,面试官估计找不到啥想问的了
- 做题
二叉树求最近公共祖先节点 + 手写并发
- 进程和线程,区别
- 进程通信的方式
- 两个并发进程同时操作i++会有什么结果,为什么会被吞操作,怎么保证执行结果
- mutex本质上是什么东西,是一块内存还是寄存器❌?(只说了是原语,不能被打断)
- 如果访问资源的时候mutex=0,这个线程会被怎么操作
- 阻塞和唤起是具体怎么实现的 ❌
- 浏览器中了解的进程和线程(一时脑抽只说出来线程)