自6月份离职以来,我经历了一段短暂的职业转型迷茫期。为了积极应对这一变化,我迅速投入准备,花费了两周时间深入研究面试题目,以期在求职过程中展现最佳状态。然而,尽管我拥有丰富的大厂工作经验,却因学历方面的相对不足,在求职市场上遭遇了一些挑战,反馈并不如预期般理想,面试机会也相对稀缺。尽管如此,我并未放弃,而是更加坚定了通过不断学习和自我提升来增强竞争力的决心。
以下是关于百度面试经验的分享,旨在进行个人经历的复盘,同时也希望为踏上求职之旅的宝子们提供一些参考,希望互相学习,早日找到合适的工作。
自荐语录:寻求精英加入的您,如有招聘需求,诚挚邀请您联系我,共筑梦想团队!
自我介绍
自我介绍就不用说了,主要是说一些简历上没有的东西,我为此准备了一段话术,主要从4个方面介绍并表达我负责的事情以及成果,分别是:
- 业务提效:
- 风险监控:
- 专业能力:
- 方法沉淀:
说一下你做的项目
前端监控平台
- 你在里面承担了哪些工作
- 监控哪些内容
- 全局监控是怎么做的
- 上报的时候是否考虑对业务的影响
- 指标是怎么收集的
- 首屏耗时怎么获取的
这些主要根据自己的项目的实际情况进行表述,另外在面试之前建议先对自己的项目进行梳理,通过绘制树状流程图的方式,清晰呈现监控平台的架构设计、核心功能以及实现路径,方便在面试中流畅的阐述细节,让面试官看到你的亮点。
场景题
正方形大小自适应的实现方式
- 使用视口单位,设置元素宽高50vw
.container {
width: 50vw;
height: 50vw
}
- 使用百分比+padding-top/padding-bottom
.container {
width: 50%;
padding-top: 50%
}
- 使用百分比+伪元素
.container {
width: 50%;
::after{
display: block;
content: "";
padding-top: 100%;
}
}
- 新属性:aspect-ratio: 1 / 1,兼容性不太好,不考虑兼容性的可用
.container {
aspect-ratio: 1 / 1;
}
回答完这些,面试官又问了
padding的设置是作用在宽上还是高上,这个问题留给各位思考??
3*3表格,边框是1px
table {
border-collapse: collapse;
}
tr, td{
width: 100px;
height: 100px;
border: 1px solid red;
}
八股文
http与https的区别
大概需要从6个点去回答,我只回答了安全、端口、协议。
下面就这几个点,简单描述下
协议安全性
- http是超文本传输协议,信息明文传输
- https也是超文本传输协议,但是是加密后的,使用的是SSL/TLS协议加密来传输数据的
端口
- http默认端口是80
- https默认端口是443
连接方式
- http是明文传输,无状态连接,一旦被截断,数据可能会被窃取或篡改
- https是加密传输,即使中断,也不会影响数据的加密,所以数据不会被窃取或篡改
证书管理
- http不需要下载证书
- https需要使用CA颁布的证书来进行加密和解密操作
资源消耗
- http消耗较小
- https由于需要加密和解密操作,消耗资源更多
兼容性
- http兼容性较好,可以在各种设备和系统上操作
- https由于要下载CA证书,可能会出现兼容性问题
基础数据类型存储在哪里?为什么?堆栈的区别?
基础数据类型存储在栈内,原因是基础数据类型是简单的,不可变的数据,他们的大小是固定的,且生命周期相对较短,通常与函数的调用周期有关,存到栈中可以确保这些数据的快速访问和释放
堆栈的区别?
主要从以下5个方向简单介绍下:
管理方式
- 栈是先进后出的数据结构,由系统自动分配和释放,一般函数调用时,局部变量、函数参数、返回地址都被被分配到栈上,当函数执行完毕,这些会被释放
- 堆是用于动态分配到,允许运行时动态分配和释放,当对象不在使用的时候,垃圾回收会将其释放
存储内容
- 栈存储的是基本数据类型和引用数据类型的引用地址,这些值大小是固定的
- 堆存储的是引用数据类型的值,大小不固定,所以需要动态分配
大小和生命周期
- 栈的大小是固定的,一般比较小,所以如果出现递归较深的情况,可能会有栈溢出的情况,栈上数据的生命周期一般与函数调用一致
- 堆的大小是不固定的,可以根据需要动态扩展,堆上数据的生命周期由程序员控制,当对象不再使用的时候,垃圾回收会将其释放
访问速度
- 栈由于是系统提供的数据结构,在底层堆栈提供了一系列分配和释放的操作,所以速度非常快
- 堆是由C/C++函数库提供的,如果不释放,程序结束的时候有可能不会被回收,所以速度相对来说慢
内存分配
- 栈是由系统自动分配和释放的
- 堆是由程序员手动分配和释放的,如果忘记释放,可能会出现内存泄露的情况
垃圾回收机制的算法有哪些?
主要有两种方式,第一种是计数器法,通过维护对象的计数器来控制对象是否被回收,这种方式比较常见,但由于容易出现内存泄露,现在已经很少使用了。第二种是标记清除法,主要分为两个阶段:标记阶段和清除阶段
1. 计数器法
含义:为每一个对象维护一个计数器,当被引用时,计数器+1,当引用被删除时,计数器-1,对象的引用计数器为0时,该对象被回收。 缺点:当出现循环引用时,计数器不会清0,导致内存不会被释放,从而出现内存泄露的问题
2. 标记-清除法
标记阶段:从全局对象开始,递归的访问对象的属性,如果访问到了,就给其标记为正在使用 清除阶段:遍历堆中的对象,将没有标记为正在使用的对象进行回收,并释放其占用的内存
react相关
setState第二个参数的作用?
第二个参数是一个可选的回调函数,这个函数会在state更新完毕且组件重新渲染之后被调用,这个函数里获取的state是最新的state值,常用来基于新的state操作DOM,发送网络请求等。
需要注意的是:setState是异步的,在这种情况下,如果多次调用setState,React会将这些进行合并更新,并在下一次事件循环中一次性更新组件,然而通过这个回调函数,你可以确保代码是在这些更新完成后执行的,从而避免了因多次更新导致的问题。
组件更新的条件?
- props
- state
- context
- 父组件更新
- 调用forceUpdate
回答完这些,面试官又问了下没的问题
组件更新后render做了哪些工作?
- 调用render函数,返回组件的React元素
- render方法根据新的props或者state,计算出新的React元素,通常是一个jsx表达式的结果
- 触发React更新机制,React会对新旧虚拟DOM进行对比,利用diff算法来找出他们的差异
- 基于fiber架构进行协调和渲染
- 协调阶段:React遍历组件树,构建出Fiber树,在这个过程中React会计算出哪些组件需要更新并对其进行标记
- 渲染阶段:React基于Fiber树中的信息,生成新的虚拟DOM树,这个阶段可以进行中断和恢复,以适应浏览器的空闲时间,避免阻塞主线程。
- 确定了需要更新的DOM节点,就进入了提交阶段,在这个阶段,React会同步的将更新应用到DOM上,并调用组件的副作用
小程序有了解吗?底层是怎么实现的?
之前支援成都团队的时候有开发过小程序项目,使用的是小程序原生的写法。没有了解过小程序底层是怎么实现的,但对于Taro有一些了解,它将代码转换成各个平台支持的小程序代码或原生代码,从而实现“一码多端”的效果。所以我理解如果要开发小程序应该也是没什么问题的,下来我也再去看下小程序的底层实现逻辑。