字节前端暑期实习一二三面+hr面(已offer)
3月25日周五 一面 70min
自我介绍
问我在LeetCode实习了多久,算是暑期实习对吧(本人菜鸡,当时做的技术内容运营,不是开发,做完实习才开始自学前端)
一、项目提问
1. 怎么理解单页应用,和传统页面有什么区别
只加载一个 html文件。传统页面用a标签做跳转
2. 单页应用实际上会渲染成a标签吗?
会的。
- 追问:那这个 a 标签和传统的 a 标签有什么区别?
往history里面push/replace。
Link 负责更新路径,Route 根据路径,映射对应的组件。
(一直没回答到点上)面试完查了一下,应该是阻止了a标签的默认行为
3. styled-components 和传统的CSS有什么区别?
引入传统的CSS样式表,相同的类名可能会引起样式冲突(CSS层叠性)styled-components可以避免组件之间样式冲突
- 追问: styled-components 怎么做到避免组件样式冲突的?
每次 styled 会生成一个componentId 追加到className后面,保证类名唯一
- 追问:普通CSS怎么做命名空间的管理?
利用CSS优先级,面试官说可以用css-modules,让我下去了解一下
- 追问:styled-components 还有什么优点?
CSS in js,可以动态获取属性。比如我们在组件标签里面写属性。比如background可以不写死,根据props里面的background去渲染。
面试官说这才是它的核心优势。CSS做动态化处理还是挺难的。
- 追问:styled-components平时用的时候有什么副作用?
回答没有,用的比较简单。后来反思,语法高亮问题?需要下载额外的插件,一开始没有输入提示很麻烦。
4. React和传统的用前端三件套写页面,优势在哪里?
可以迅速搭建起框架。组件化。虚拟DOM。
- 追问:你怎么理解组件化?把组件分散在一个一个文件里是这个意思吗(他在挖坑呜呜)
- 追问:组件之间相互引用怎么做到的?
import
5. 追问 import 浏览器支持吗?
(你在浏览器里面可以直接 import 吗?- 不可以)
(那怎么引入的,你刚说是babel,确定是它实现的功能吗?-不知道5555)
里面包含了很多知识,让我了解,你就没有好奇过为什么可以 import 吗?
答common JS 用require,import 是 es6 的语法。
- 追问 require就支持吗?(555555我真的会哭)require 和 import 有什么区别,为什么会有这两种形式的引用?
import 可以默认暴露,也可以分别暴露。
- 追问 require 就不行吗?应该有区别的吧,如果一模一样应该就不会有两种了
面试官:这些都是你项目里用到的,所以我会比较想了解。
6. 登录鉴权是怎么做的?包括前端和后端
因为我没有具体做这个功能,只用login代表了用户是否登录。面试官让我说一下如果要做,怎么做。。。。。
输入用户名和密码,获取用户的输入,把它存起来。下次做对比。
- 追问:页面刷新怎么登录态的维护?
刷新后还是登录的,可以走缓存
- 追问:怎么缓存,存什么?登录信息从哪拿的?
存在 cookie 里。我绕到了协商缓存,把协商缓存的流程说了一遍。面试官和这个是资源的获取,和登录没关系
- 追问:这块没做是吧?到时候就按你这个思路想一下整个流程是什么样的。
- 追问:把账户密码存起来,是存在前端还是后端?
存在后端,因为下一次发送请求要和后端存的数据进行对比
- 追问:那下次登录,对比完账户密码相同,然后怎么做
跳转到首页
- 追问:那我这个时候登录页面,拿到的登录态就是登录的对吗?这个登录态是怎么获取的呀?
(面试完想起来了,这个好像就是在引导上一个问题,应该把login这个数据设置为true)
二、JS相关
7. 闭包是什么?产生的原因是什么?
闭包:一个作用域可以访问函数的局部变量
- 追问:函数作用域本来就是会向上级查找的啊,这和闭包有关系吗?你回答的是作用域的特性
你说闭包是什么,也没讲太清楚
(后面想了一下,就是函数里面还有函数,就会产生闭包?)
函数作为参数,或者函数作为返回值。
- 追问:函数作为参数为什么会产生闭包?可以举个例子吗?
函数作为参数,里面有一个变量,你在函数里可以访问到这个变量。
- 追问:我们正常写函数,内层函数就是可以访问到外层函数的变量,但是外层函数不能访问内层函数的变量对吧?这是因为什么?
函数在执行的时候会产生函数作用域,执行结束就销毁了。
- 追问:执行结束就销毁了?那你刚才说还会一直存在引用是什么?
函数里面返回了一个内层函数,调用了外层函数,就获得了内层函数。但是不执行内层函数,里面的变量就得不到释放。
- 追问:函数作用域是什么时候确定的?
调用函数时,创建函数作用域。函数执行完毕后,函数作用域销毁。
每调用一次函数,就会创建一个新的函数作用域,它们之间是相互独立的
注意区分:自由变量的查找,只在函数定义的时候,而非函数调用的时候。
8. 箭头函数和普通函数的区别
语法:()=>{},一个可以省略(),执行体只有一行可以省略{ } 和 return
()=>({})表示返回一个对象
this:箭头函数没有自己的 this 和 arguments
- 追问:普通函数里面放一个箭头函数,执行普通函数,箭头函数里面的 this 指向什么
三、网络协议
9. TCP 为什么要三次握手
最后一次,客户端向服务端握手,服务端才能确认客户端的接收消息的能力是正常的。
10. TCP 协议是在网络模型的哪一层
传输层
- IP 协议呢
网络层
- 网络层还有没有其他协议?
ICMP(网际控制报文协议)确认IP包是否正确到达目标地址
- 四层模型还有哪两层?
链路层 应用层
- 传输层还有没有别的协议?
UDP
- TCP和UDP 区别
是否需要连接,面向字节流/报文,是否1对1,可靠性
编程题
1. 实现函数 sum,求参数的乘积,以下两种都能满足:
sum(2,3) 输出 6
sum(2)(3) 输出 6
进一步,实现求和函数 sum(1,2,3,4) 和 sum(1)(2)(3)(4) 都可以输出 10
考察函数柯里化
2. 剑指 Offer 22. 链表中倒数第k个节点
二面:4月7日 1h
问答30min,然后做了三道题
- 波峰数组,要求复杂度低于O(n) --- 二分+递归
- 画边长 100 的直角三角形,(两种方法,一个border 和 两个 border 都可以实现)
- 至少三种方法获取 obj 的所有 value
追问,普通对象可不可以 for of?为什么不可以?怎么改可以for of
三面:4月18日 1h
问答 30min,然后做题
- 判断镜像二叉树
- 智力题,抛硬币五次,求至少两次正面朝上的概率
hr面:4月22日 30min (有点点压力面的感觉)
- 个人优缺点,举例
- 对部门的了解
- 项目难点怎么解决
- 为什么选前端
offer:4月26日