2022字节实习面经(已OC)
本人现大三学生,于2022年11月份面试实习字节跳动,已OC,base北京 技术中台
下面是我的面经,希望可以帮到你!
一面
1. 讲下你的项目
概括性地介绍了一下项目,具体实现的功能,以及自己准备的一些可以扩展的项目亮点
2. 如何实现15天免登陆
这个问题是根据上面的回答进行的进一步追问,我主要是通过 access token 和 refresh token 实现的,另外利用了缓存加锁对并发请求实现了进一步的控制(具体略)
3. 如何实现聊天功能
项目中利用的是 socket.io 实现实时通讯,具体项目实现以及对从 socket.io 实现原理,到 webSocket 原理、长轮询、短轮询机制
4.还有什么要补充的项目亮点吗?
再详细讲了一下如何通过 vue.extend 封装自定义命令式组件以及防抖处理搜索框
5. HTTP状态码
- 大体说一下五大类 1xx,2xx,3xx,4xx,5xx 状态码总体的含义
- 之后,说一些具体常见的状态码,比如 200,301,302,304,404
Tips:确保提到的具体的状态有深入了解以及扩展,将面试官向自己擅长有准备的方向去引导,比如可以说 304 从而引导问 浏览器缓存方面的问题
6. 浏览器缓存
这里同样概括性列出几个要点:
- 为什么要有浏览器缓存(减轻服务端负担等...
- 浏览器缓存机制的大体流程 第一次访问,没有缓存:直接请求服务器以及返回相应缓存字段再次访问 缓存未过期:强缓存缓存过期:协商缓存
7. 读代码
window.name = 'byte'; function A(){ this.name = 123 } A.prototype.getA= function(){ console.log(this); return this.name +1 } let a=new A(); let funcA = a.getA funcA() 复制代码
输出:byte1
这里涉及知识点包括:
- this 指向
- 字符串
8.函数柯里化实现
9.写防抖、节流、问问闭包
10.合并两个有序数组(算法)
体验:一面问题这里可能有遗漏,没有及时记录,现在想起有点遗忘,一面是一个小姐姐面的,体验感也不错,自己输出了很多,二面面试官有提到自己在一面面评回答浏览器缓存回答的很好hh
二面
1.TCP为什么需要三次握手?
关于计网这里推荐学习:小林Coding
2.https
3.中间人攻击是什么 怎么预防
4.为什么出现了http2.0
这里就要从HTTP发展史以及HTTP2.0解决的问题来入手
5.为什么要有缓存
6.为什么要设计强缓存和协商缓存
7.JS数据类型
这个问题也很常问奥分为原始数据类型和引用数据类型,把各自类型都分别说一下然后可以从两者的存储位置进行扩展
8. 判断是数组 instanceOf 原理
手写也要掌握奥
9.考察js作用域的一道输出题并解释
var x = 10; (function (fn){ var x = 20; fn(); })(function(){ console.log(x) }) 复制代码
这里主要考察js作用域是词法作用域,在定义的时候就决定了,所以x的作用域就是全局,输出10
10.事件循环输出题 为什么要有宏任务和微任务 为什么要有任务队列
这里就可以看出面试官不仅仅关注一些知识本身,更关注它的历史发展和缘由,所以就像我之前说的学知识要多问为什么?关注来源、历史发展才能进一步掌握
11.算法:求两个数组的并集
12.手写Promise.all
Promise这里建议把源码都过一遍
体验:夸完一面面评,就来了两个浏览器缓存的为什么打得措手不及,在自己的理解之上说了一些,总体回答的还不错
三面
主要是集中项目展开问的
为什么要用refresh token? 缓存加锁的弊端
有考虑过使用 cookie 实现15天免登陆吗?优点是什么?
微信实现就是用 cookie ,leader这里向我推荐了要学会向“竞品”学习
聊天是通过什么实现的?用webSocket 有什么弊端?
实现红绿灯
绿、黄、红循环m次,每隔n秒一亮
function red(){ console.log('red') } function green(){ console.log('green') } function yellow(){ console.log('yellow') } const step = (m, k, n) => { if(k <= m){ task(n, 'red') .then(() => task(n, 'green')) .then(() => task(n, 'yellow')) .then(() =>{ step(m, k+1,n) }) } } step(2, 1, 1000) 复制代码
把step改写成async形式
const step2 = async(m, k, n) => { if(k <= m){ await task(n, 'red') await task(n,'green') await task(n,'yellow') step2() } } 复制代码
最后还有一道不难的算法题
体验:leader 人真的很好!很尊重我的想法,愿意倾听和肯定我的思考方向,同时会给予我一些额外的建议,受益匪浅!
hr面 11.22
前面几轮面试整体感觉是怎么样呢?
了解业务方向吗?
什么契机接触前端?为什么学前端呢?
介绍印象比较深的一个项目 项目中比较大的挑战?
以前暑假寒假都做什么
未来职业规划
互联网行业吸引你的点在哪?
自我评价 优缺点? 最近成就感较大的事情?
一周后就发 offer 啦,激动子!最后毅然选择去了字节啦~ base北京 技术中台(今年初九实习报到)
学习总结
- 尽可能将面试官往你会的知识点去引导,自己说出来的知识点就一定要是你深入扩展的,不然稍微一问就不知道啦(当然从学习本身出发,有探究精神,学知识要了解前因后果以及扩展必然也是不可少的!)
- 学习知识不要仅限于这个知识点,推荐从历史发展的层面去看,从这个东西为什么要有? 要解决什么问题? 它的前身是什么? 有什么缺陷导致后续的发展,这样才可以进一步掌握知识!(面试官也经常会问为什么哦)
愿所有努力都不会被辜负祝愿你也得到你想要的offer哦!加油!