6月,来自百度的第一份面试

123 阅读8分钟

自6月份离职以来,我经历了一段短暂的职业转型迷茫期。为了积极应对这一变化,我迅速投入准备,花费了两周时间深入研究面试题目,以期在求职过程中展现最佳状态。然而,尽管我拥有丰富的大厂工作经验,却因学历方面的相对不足,在求职市场上遭遇了一些挑战,反馈并不如预期般理想,面试机会也相对稀缺。尽管如此,我并未放弃,而是更加坚定了通过不断学习和自我提升来增强竞争力的决心。

以下是关于百度面试经验的分享,旨在进行个人经历的复盘,同时也希望为踏上求职之旅的宝子们提供一些参考,希望互相学习,早日找到合适的工作。

自荐语录:寻求精英加入的您,如有招聘需求,诚挚邀请您联系我,共筑梦想团队!

自我介绍

自我介绍就不用说了,主要是说一些简历上没有的东西,我为此准备了一段话术,主要从4个方面介绍并表达我负责的事情以及成果,分别是:

  1. 业务提效:
  2. 风险监控:
  3. 专业能力:
  4. 方法沉淀:

说一下你做的项目

前端监控平台

  1. 你在里面承担了哪些工作
  2. 监控哪些内容
  3. 全局监控是怎么做的
  4. 上报的时候是否考虑对业务的影响
  5. 指标是怎么收集的
  6. 首屏耗时怎么获取的

这些主要根据自己的项目的实际情况进行表述,另外在面试之前建议先对自己的项目进行梳理,通过绘制树状流程图的方式,清晰呈现监控平台的架构设计、核心功能以及实现路径,方便在面试中流畅的阐述细节,让面试官看到你的亮点。

场景题

正方形大小自适应的实现方式

  1. 使用视口单位,设置元素宽高50vw
 .container {
     width: 50vw;
     height: 50vw
 }
  1. 使用百分比+padding-top/padding-bottom
.container {
    width: 50%;
    padding-top: 50%
}
  1. 使用百分比+伪元素
.container {
    width: 50%;
    ::after{
        display: block;
        content: "";
        padding-top: 100%;
    }
}
  1. 新属性: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会将这些进行合并更新,并在下一次事件循环中一次性更新组件,然而通过这个回调函数,你可以确保代码是在这些更新完成后执行的,从而避免了因多次更新导致的问题。

组件更新的条件?

  1. props
  2. state
  3. context
  4. 父组件更新
  5. 调用forceUpdate

回答完这些,面试官又问了下没的问题

组件更新后render做了哪些工作?

  1. 调用render函数,返回组件的React元素
  2. render方法根据新的props或者state,计算出新的React元素,通常是一个jsx表达式的结果
  3. 触发React更新机制,React会对新旧虚拟DOM进行对比,利用diff算法来找出他们的差异
  4. 基于fiber架构进行协调和渲染
  • 协调阶段:React遍历组件树,构建出Fiber树,在这个过程中React会计算出哪些组件需要更新并对其进行标记
  • 渲染阶段:React基于Fiber树中的信息,生成新的虚拟DOM树,这个阶段可以进行中断和恢复,以适应浏览器的空闲时间,避免阻塞主线程。
  1. 确定了需要更新的DOM节点,就进入了提交阶段,在这个阶段,React会同步的将更新应用到DOM上,并调用组件的副作用

小程序有了解吗?底层是怎么实现的?

之前支援成都团队的时候有开发过小程序项目,使用的是小程序原生的写法。没有了解过小程序底层是怎么实现的,但对于Taro有一些了解,它将代码转换成各个平台支持的小程序代码或原生代码,从而实现“一码多端”的效果。所以我理解如果要开发小程序应该也是没什么问题的,下来我也再去看下小程序的底层实现逻辑。