原文首发
掘金
开头
大家好,我是林一一。有一段时间没有写博客了,因为最近几个月的时间都放在秋招上面了,想了好久,秋招的经历不知道写还是不写。最近思绪很乱,心情也比较浮躁,想躺平一段时间,但总感觉有很多事情要做。下面的某些文字(非面试部分)删了又写,写了又删,从 1号 到现在一直断断续续的。这篇文章就算是给自己大学秋招的做一份记录,也是自己成长的一份记忆。
秋招结果简述如下:
- 百度 offer
- 京东 offer
- 爱奇艺 offer
- 有赞 offer
- 深信服 offer
- 字节(bushi😂)
腾讯 offer
秋招投了很多公司,包括字节,腾讯。。。
7月是一个好月份,哈哈。学校也开始放暑假了,但是暑假图书馆也只能开放一楼,每天十几分钟带着电脑 翻山越岭
过来。我是今年7月份开始投递简历的,但是提前批我基本没有机会参加任何面试,因为简历过不了(😂苦笑.jpg),加上有提前批的企业很少,所以整个七月基本都是感谢信😂。
时间推到了八月份逐渐开始了面试。下面的面经是秋招的一个记录,但是由于我技术能力和水平非常有限,可能这篇文章对大家不会有多大的帮助。__而且时间过的比较久了,我并没有一一记录下所有的面试题。__
关于我
关于我写在文章最后吧,发发牢骚。😂
字节电商(提前批)
7月提前批投简历,一投就挂简历,同学推来一个 HR 微信。我简历将塞到了一个 HR 手里,最后给了一次面试机会。
一面
一面的面试官很亲切,先微笑的和我自我介绍一下自己。给人感觉特别不错,整个面试过程很舒服,有说有笑。
- 自我介绍
- JS 类型 -> symbol 的出现原因,解决了什么问题 ->bigint 有什么作用-> 类型检查有哪些->typeof 的原理(二进制)-> null 为什么会被判断成
object
。 - 讲讲 0.1 + 0.2 != 0.3 的原因,编写一个函数解决这个问题。
- typeof 和 instanceof 的区别。
- 写一个可以检测所有类型的方法。
- for in 和 for of 的区别。
- 页面性能优化有哪些。(提到了服务端压缩,http 缓存,回流重绘等等,面试官就从这里面提问)
- 协商缓存的字段
Cache-Control
有哪些属性值,-> max-age 的属性值有哪些区别。为什么 http1.1 要新增 Cache-Control 这个字段? - 图片懒加载你是怎么实现(我用的是 IntersectionObserver 来写)
- transform 会导致重排和重绘吗?为什么(Recalculate Style -> Layout -> Paint Setup and Paint -> Composite Layers 因为,transform 位于复合层 Composite layer 层)
- 服务端的 Gzip 压缩和 deflate 压缩有什么区别,使用了什么算法。(LZ77,顺便答了 png 的使用算法)
- 知道哪些网络攻击的方式?(提到了 csrf和xss)怎么做过滤和赛选的?
- CSRF 攻击怎么防御,origin 和 referrer 有什么缺点。
- cookie 有哪些属性值?cookie 的 sameSite 属性值有什么作用,httpOnly 和什么有关系
- 浏览器怎么实现跨域,为什么会有跨域的问题?sessionStorage 能在同源不同页面下共享数据吗?(不能)
- 写一下 JSONP 的实现原理。postMessage 有了解吗?
说一下浏览器的事件循环?浏览器的事件循环和 node 的事件循环有区别吗?(node V10之前有区别)
// 一道题 async function async1() { console.log('async1 start'); await async2() console.log('async end'); } async function async2() { return new Promise((resolve, reject) => { console.log('async2 start'); resolve() }).then(res => { console.log('async2 end'); }) } async1() new Promise(resolve => { console.log('Promise'); resolve() }).then(res => { console.log('Promise end'); }) console.log('script end'); // async1 start async2 start Promise script end async2 end Promise end async end
- requestAnimationFrame 有了解吗?在事件循环的哪一个阶段执行?
- 说一下 Promise。(这里同样问了好多 Promise 的问题)
实现一个 schedule 类
class Scheduler { add(promiseCreator) {/*...*/} // ... } const timeout = (time) => new Promise((resolve) => { setTimeout(resolve, time) }) const scheduler = new Scheduler() const addTask = (time, order) => { scheduler.add(() => timeout(time)).then(() => console.log(order)) } addTask(1000, '1') addTask(500, '2') addTask(300, '3') addTask(400, '4') // output: 2 3 1 4 // 一开始,1,2两个任务进入队列 // 500ms时,2完成,输出2,3进入执行队列 // 800ms时,3完成,输出3,4进入执行队列 // 1000ms时,1完成,输出1 // 1200ms时,4完成,输出4
- 实现一个 Promise.all
有什么想问我的
这一面时间比较长 1 小时多点,面试官说过了。面试官最后告诉我,简历上学校不好,但是 Blog 写的还可以这也是一个亮点,所以给了面试的机会。很感谢面试官的鼓励。当时还想给他当小弟来着,但希望就结束在二面了
二面
被彻底碾压的一面。
- 问了一下项目。
- mixin 的原理和优先级,mixin 存在的缺点(优先级问题),怎么解决。
- 写过 vue的插件吗?vue 的插件中 install 实现原理,比如 vueRouter 中的 install 有什么作用。
- vue 中一个数据修改多次,一万次, vue 是怎么处理的,一次渲染一遍吗?(讲了vue异步更新的原理,他不满意)
- 详细讲讲 dep 和 watcher。
- 你是计算机专业的吗?有学过计算机网络吗?(不是)就问问了 OSi 七层协议,哪些层用了哪些协议。
箭头函数可以使用 new 的吗,有 this 吗?new 关键字背后实现了什么 -> 在使用 new 关键字的构造函数里面 return 一个 object 或基本类型会怎样。
// 一道题 var a = 0; function Parent() { this.a = 1; return this; } Parent.a = 2; Parent.prototype = { a: 3, setA: function (value) { this.a = value; return this; } } console.log(new Parent().a); console.log(Parent().a); console.log(new Parent().setA(4).a); console.log(a); console.log(Parent().setA(5).a);
面试官不停的在催促答案是什么😅
- CSS 实现动画好还是 JS 实现动画好,为什么?
- cookie 可以跨域吗? domain 属性被修改了会有效果吗?
- 详细说说 url 到页面显示的过程。
- 页面是先停止渲染还是先 tcp 挥手(我说了不同情况。面试官不满意,让我回去写一个 node 服务器,然后向客户端发送一个个 chunk 就知道了)
- 写过小程序吗,小程序的 url 地址看不见,不用域名可不可以直接使用 IP 。这样就省略了 dns 的解析不是更好吗?为什么?
- 说说跨域,jsonp 怎么处理多个组件需要调用的方法名字相同,冲突了怎么办?
- 设置了 Access-Control-Allow-Credentials和witheCredentials 为什么 cookie还是没能成功跨域;
反转链表,多层数组反转( [1, [2, [3, [4, [5, 'null']]]]] => [5, [4, [3, [2, [1, 'null']]]]]);
从后面开始,笑嘻嘻了。。。
百度
一天面完
一面
上来就是两道算法题
- 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表 1->2->3->3->4->4->5 处理后为 1->2->5。
给出一个整数数组 A 和有序的整数数组 B ,请将数组 B 合并到数组 A 中,变成一个有序的升序数组
function merge( A, m, B, n ) { // ... }
注意:1.保证 A 数组有足够的空间存放 B 数组的元素, A 和 B 中初始的元素数目分别为 m 和 n,A 的数组空间大小为 m+n。 2.不要返回合并的数组,将数组 B 的数据合并到 A 里面就好了。 3. A 数组在[0,m-1]的范围也是有序的
说明:A 数组为[4,5,6],B数组为[1,2,3],后台程序会预先将 A 扩容为[4,5,6,0,0,0],B还是为[1,2,3],m=3,n=3,传入到函数merge里面,然后请同学完成merge函数,将B的数据合并A里面,最后后台程序输出A数组
示例:输入 [4,5,6],[1,2,3] 输出[1,2,3,4,5,6]。
输入
[1,2,3],[2,5,6]
输出
[1,2,2,3,5,6]
- 强缓存、协商缓存,这里问了好多,涉及到具体字段的设计、优缺点等(项目做过的缓存策略,缓存的依据)
- Node 事件循环和浏览器有什么区别?有输入输出题
- vue 的响应式原理。这里讲了好多,顺带提及了
nextTick
为什么可以在渲染Watcher
的后面可以拿到新的DOM数据 nextTick
实现原理(兼容性的4级降级处理)- 闭包,闭包会存在什么问题,随后问怎么检测内存泄露的问题,什么情况会导致内存泄露。怎么解决(performance面板和memory快照)
- 浏览器的渲染原理,GUI 线程是怎么处理页面不同资源的。涉及到
async
和defer
区别。DOMContentLoaded
和load
区别 - 怎么优化页面的性能,从哪里入手分析,分析了 performance 和 network 面板的参数。
- 怎么计算首屏时间 FCP,白屏时间。
- TCP 队头阻塞,TCP拥塞控制。(讲了拥塞控制的原理和实现算法)
- TCP 的流量控制,滑动窗口实现原理。
- HTTP3.0 解决了什么问题,和 HTTP2 区别,详细介绍 多路复用,多路复用存在什么缺陷。
。。。
面试体验不错。还有一些题目不记得了,题目的顺序不太一样。几分钟后二面
二面
二面的面试官比较严肃。氛围比较冷。同样上来还是算法题
- 二叉树的相关问题,题目没有记录了,写出递归和非递归的两种写法,(哦,这里还有时间复杂度的要求)
- 一道链表有环和统计环的长度问题
- 进程和线程的区别 (管道,共享内存,socket 套接字。。。,这里拉扯了一下浏览器的沙箱机制)
- 浏览器页面渲染过程,这里讲了好久。问的也深
- HTTPS。
- SSL 的握手过程,握手的最终结果拿到的密钥是对称密钥还是非对称密钥?(这里解析了一波对称密钥和非对称密钥的加密原理)
- 了解哪些对称密钥的加密算法(讲了 DES,3DES,RSA)
- SSL 每次都需要来一次握手过程吗?(握手后有一个 key 存在了 sessionID 中,验证 sessionID 就行)
- 浏览器是怎么验证 CA 证书的有效性的。(摘要算法的数字签名)
- 了解 webpack 吗?怎么编写一个 loader 和 plugins?你有做过哪些性能上的优化。(提及了plugins 中的运用函数 apply 和接收参数的 complier 和 compilation )
- HMR 原理(关键是 Websocket)。
- 有了解过哪些新的技术。
- 有哪些想问我的。
。。。
还有些问题记不太清楚了,结束后,叫我等会三面。
三面
三面聊了很久,和面试官聊的比较愉快,很亲切。
没有 HR 面
京东
一面:
- html 语义化的标签和意义?
- h5 的新特性有哪些?
- css3 的新特性?css3 的动画有哪些?
- Animation 和 transition 具体的区别?
- 怎么捕获动画最后一帧?
- 物理像素和逻辑像素区别?为什么存在移动端 1px 的问题,怎么解决
- 盒子模型,标准和被标准盒子模型有哪个属性决定?
- border-box 和 content-box 之间的区别。
- css 有哪些选择器,优先级关系
下面的 div 标签显示什么颜色
.blue { color: blue; } .green { color: green; } .red { color: red; } <div class="red green blue">颜色</div>
变量提升问题
var foo = 'jd'; (function(f){ console.log(foo); var foo = f || 'hello'; console.log(foo) })(foo); console.log(foo)
不是这道题,但是类似。
- 原型和原型链?模拟实现一个
instanceof
- 闭包?出了一道题。
- 类型检测有哪些?typeof 检测的机制是什么?0.1 + 0.2 == 0.3 吗?为什么不等?
- this 指向问题,js 中有哪些方法可以改变 this 的指向,出了几道题。
- 浏览器的渲染原理,回流和重绘啥的
- 算法题:
1)跳台阶。类似 lettcode
这道题需要写出两种不同的解法,要求一种使用动态规划
2)第二道题忘记了,好像 easy 或是 mid 难度的题。
几分钟后发来二面链接。
二面:
- vue 源码相关的问题(因为一面面试官没有问,所以二面问了):
- vue 的响应式原理
- nextTick 的实现原理,(这里拉扯到了 Vue 更新的异步原理)
- vuex 原理和作用, vueRouter的原理(路由中 install 方法的原理) 和 生命周期啥的
- 计算机网络的一些问题。
- http 的某一些字段作用和场景和状态码啥的。
- tcp/utp(记得这对比了HTTP3的 QUIC协议)
- webpack 打包工具了解多少,这里问了好多。
- 场景题
1) 实现一个9宫格,最少可以使用多少个 div ? (一开始回答错了,面试官说了3个就行,我愣了一下,说了一句重叠吗?他哈哈笑起来,说我可没有说过不能重叠。然后两个人又开始笑了起来😂)
2) vue 中的 vueRouter 怎么实现路由权限校验(写了伪代码)
算法题:只有一道忘了。
有一些记得不太清楚了。这里就不写上了
hr 面
hr 面很多是规划,兴趣爱好啥的。
字节飞书正式批
同样再次跪在二面,面完二面人都恍惚了。。。二面全程写题,题目并不能说难,只是比较绕。
爱奇艺
爱奇艺面试流程很长差不多两个月。。。。 3论技术+1轮HR面,流程太久了题目很多不记得了,只记住几道算法题
- 买卖股票的最佳时机 II
- 大数相加
- 无重复字符的最长子串
- 链表相关
- 实现深拷贝
- 编写 vue 路由的检验
- 怎么编写一个 vue 的指令(讲了内部的回调函数实现)
有赞
真觉得有赞的技术不错,开源的 vantUI 很有名气。面试的过程中和面试官很聊得来。有赞的面试很多也不太记得了,就不写了,大家需要的可以去牛客看看。
感谢
感谢秋招一路过来帮助过我的各位前辈。
关于我
一个矫情的人写着不文艺的文字,看起来有些 emo,哈哈。有很多时候努力付出却没有回报的事情真的很多,像心心念念的 offer,像难得遇到喜欢的人,原本以为努力变的优秀事情会朝好的方向走,原本以为拿到好点的 offer 能有点改变,但事情并没有出现自己预料的走向,只能嘻嘻了。越想要的越得不到,这话很无奈,很丧气。最近在掘金沸点看到很多前辈们的情情爱爱,最后似乎并没有成功的,大抵是这种感觉吧。很可惜。接受要接受的,改变能改变的。这是成年人世界的失落和无奈。但是不管怎样,菜就去变强,不足就去弥补,这总不会错。
整个秋招的心情就像坐过山车一样,迷茫,彷徨,失落,自信,再次失落,再次自信。每每觉得没有选择的时候,老天像是和你开玩笑一样,再次向你脸上砸来一个机会。那时的我只想抓住他,无论怎样。秋招很激烈,很煎熬,过程很漫长。秋招伊始那个时候我还记得我曾和舍友说过可能找不到工作了,舍友漫不经心的来了一句,“我在见证一个大佬(菜狗)的成长”(我菜狗一个)。
我曾盼望着秋招结束后,去投喂图书馆沿路的小猫们,看着一窝窝的小猫崽出生到长大还蛮有趣的,也想呆呆的坐在图书馆里做着想做的事,一边看看坐在我前面爱傻笑的女孩儿。你是非常可爱的人,真应该遇到最好的人,我也真希望我就是。
大家加油,我们都会上岸的(希望舍友考研,考公都能上岸),毕竟乾坤未定。
我是林一一,下次见。噢,如果觉得还可以的希望 github star 啦
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。