Answer 面官系列
XX 同学是吧,本次是跟你做一个初步的沟通,了解一下你的基本情况
1、首先请你简单的做一个自我介绍
。。。
2、好的,那讲讲你做过的项目吧
。。。
3、你在项目中有遇到过什么困难吗
。。。
3-1、怎么解决的
。。。
4、诶,XX,你是为什么想做前端呢
。。。
5、那你平时都是怎么学习前端的
。。。
6、了解,你现在人在深圳是吗?
。。。
6-1、是家在这边吗还是
。。。
6-2、租房住,你是一个人住吗
。。。
6-3、我们是在科苑地铁站这边,你离的远吗
。。。
7、好的,那问些技术问题吧,说说你对盒子模型的理解
盒子模型可以看作是一个容器,包含自身的内容、内边距、边框和外边距;默认为标准模型,当设为 border-box IE 模型时,边框和内边距不会将盒子撑大。
7-1、那 JS 中我们一般如何获取盒子模型的宽高呢
样式设置的宽高可通过 dom.style.width 或 window.getComputedStyle(dom).width 来获取,其中 dom.style.width 只能获取行内样式的宽高;另外,元素的实际宽高可通过 dom.offsetWidth 或 dom.getBoundingClientRect().width 来获取;还有一个 dom.clientWidth 用于获取元素实际宽高减去边框后的值;
8、下一个问题,基本类型和引用类型有什么区别呢
- 基本类型的值不可变,而引用类型的值可变;
- 基本类型保存在栈中,而引用类型指针保存在栈中,内容保存在堆中;
- 基本类型的比较是判断是否相等,而引用类型的比较是判断是否指向同一对象;
- 基本类型的复制是复制它的值,而引用类型的复制是改变引用的指针,仍指向同一对象。
9、了解,那请问深拷贝和浅拷贝有什么区别呢
浅拷贝是增加一个指针指向原有的地址,与原对象会相互影响,可通过 Object.assign()、扩展运算符等方式实现浅拷贝;而深拷贝是增加一个指针指向申请的新地址,与原对象互不影响,可通过封装一个递归函数或使用 lodash 的 _.cloneDeep 方法来实现深拷贝。
10、我们在声明值时,用到的 let 和 const 有什么区别
let 是声明变量,而 const 是声明常量;
10-1、那 const 声明的引用类型可以修改吗(为什么
const 保证的是变量指向的内存地址不变。基本类型的值保存在内存地址中,因此 const 声明基本类型等同于声明常量。而引用类型变量指向的内存地址是个指针,const 只保证这个指针不变,而无法保证指针指向的内容不变,因此 const 声明的引用类型可以修改。
11、好的(没事)下一个问题吧,你可以讲讲同步和异步的区别吗
同步任务强调顺序性,而且会阻塞代码执行,只有前面的执行完,后面的才会继续执行;而异步任务不会阻塞代码的执行。
11-1、你对事件循环的理解(Event Loop)
JS 的运行过程中,遇到同步任务时会直接执行,而遇到异步(宏/微)任务时,会先放入(宏/微)任务队列,等同步任务执行完再执行任务队列的异步任务,主线程不断重复这个过程,就是 Event Loop 事件循环。
11-2、对宏任务和微任务的理解
异步任务也包括宏任务和微任务,在 JS 的运行过程中,遇到宏任务和微任务都会先放入任务队列,等同步任务执行完,微任务会先被调入主线程中执行,然后才是宏任务。常见的宏任务包括 setTimeout、setInterval、I/O 操作等,而常见的微任务包括 Promise、MutationObserver 和 Node.js 的 process.nextTick 等等。
12、Vue 系列
12-1、我看你用过 Vue 是吧,那在 Vue 中我们渲染列表时常常会加一个 key 值,为什么要加这个 key 值呢
遍历节点时需要给每个节点设置一个 key 值作为唯一标识,使 diff 算法可以正确识别此节点,找到正确的位置插入新节点,从而高效的更新虚拟 DOM。
12-2、Vue 的 diff 算法是怎样的
Vue 的 diff 算法会对比新旧虚拟 DOM,其中通过双端对比,将两个指针一个从前面开始,一个从后面开始,过滤出中间改变的部分,然后使用最长递增子序列算法,保证节点的移动次数最少。
12-3、下一个问题,你能讲讲 Vue2 和 Vue 3 的区别吗
Vue3 使用 Proxy 来重构响应式,解决了 defineProperty 无法监听响应对象新增属性的问题;而且新增了 Composition API,可以更灵活的组织逻辑;另外,Vue3 还在 Diff 算法、静态提升和事件监听缓存等方面进行了优化,大幅度提升了性能。
12-4、Vue3 在性能方面进行了什么优化
Vue 3 对 diff 算法进行了优化,新增了静态标记,只对比带有标记的节点,减少比较次数以提升性能;Vue 3 还对不参与更新的元素做静态提升,只创建一次,在渲染时直接复用,避免节点的重复创建;另外,Vue3 还做了事件监听缓存优化,将事件缓存起来复用,以提升性能。
13、React 系列
13-1、我看你用过 React 是吧,那在 React 中我们渲染列表时常常会加一个 key 值,为什么要加这个 key 值呢
遍历节点时需要给每个节点设置一个 key 值作为唯一标识,使 diff 算法可以正确识别此节点,找到正确的位置插入新节点,从而高效的更新虚拟 DOM。
13-2、那 React 的 diff 算法是怎样的
diff 算法就是用来高效地对比新旧虚拟 DOM,找出真实 DOM 的变化之处。React 的 diff 算法使用三大策略来降低 diff 算法的复杂度,首先只对同一层级的节点进行比较;其次,如果比较的组件是同一类型,则继续往下进行 diff 运算,如果不是同一类型,则直接删除被比较的组件及其子节点并重新创建;最后,同层级的一组子节点,还会通过 key 值进行区分。除了三大策略优化 diff 算法外,React 还引入了 Fiber 架构,比 Vue 的 diff 算法多了时间切片的能力。
13-3、如何理解 React 的受控组件和非受控组件
受控组件的值由 React 进行管理,通过传入的 value 来固定组件的值,并通过 onChange 事件来进行值的更新;而非受控组件不传入 value,一般只传入 defaultValue 作为初始的默认值,即使 defaultValue 的值固定,组件的值也不受影响。
13-4、什么情况下需要使用 Redux
共享公共数据
14、XX,你会用 git 吧,那讲讲你常用的 git 命令有哪些
- git init 初始化;
- git clone 克隆;
- git add 添加到暂存区;
- git commit 提交;
- git pull 拉取代码;
- git push 推送;
- git status 查看工作区;
- git branch 查看分支;
- git branch 加分支名创建分支;
- git checkout 加分支名切换分支;
- git merge 合并分支。
14-1、git rebase 是干嘛的,有什么风险
rebase 变基操作是将提交到某一分支上的修改应用到另一分支,但 rebase 会修改提交 ID,导致历史记录的变更,因此,如果自己的提交已经被推送,就不建议使用 rebase 进行变基操作。
15、下一个问题,我们在浏览器输入一个 url 时会发生什么
首先解析域名;然后三次握手建立 TCP 连接;接着浏览器向服务器发送 HTTP 请求,拿到响应结果后处理页面;最后四次挥手断开 TCP 连接。
15-1、怎么理解三次握手
TCP 三次握手指的是建立连接时,需要在客户端和服务端之间发送 3 个包,以确认双方的发送能力和接收能力正常。如果是两次握手,客户端可以确认自己的发送能力和接收能力正常,但服务端只能确认自己的接收能力正常,而无法确认发送能力是否正常。
16、HTTP 状态码了解吗(讲讲你所知道的状态码)
- 200:是请求成功;
- 301:是永久重定向;
- 302:是临时重定向;
- 304:是请求的资源未发生变化,可以直接使用本地缓存;
- 400:是请求报文语法错误;
- 401:是请求需要通过 HTTP 认证;
- 403:是请求资源被服务器禁止访问;
- 404:是请求资源不存在;
- 500:是服务器执行请求时发生了错误;
- 503:是服务器正在忙。
17、GET 和 POST 的区别
- GET 的请求参数放在 url 中,而 POST 的请求参数放在请求体中,更为安全;
- GET 传输的参数有长度限制,而 POST 没有;
- GET 请求会被浏览器主动缓存,而 POST 不会。
18、好的,那我这边就先问到这哈,你这边有什么问题要问的吗
- 项目:我们是做文心大模型的预设插件,会涉及到一些算力的计算和模型的训练,前端的话技术栈是 React 18 和 Vue3 同时在用
- 转正:我们现在招的是日常实习,不过表现优秀也是有机会转正的
- 多久答复:因为有其他同学在流程中,所以我们会先综合去对比,所以具体多久答复也要看情况
19、那我们本次沟通就先到这,后面有结果我们会通知,你有什么问题也可以直接微信问我,感谢你的时间(拜拜
。。。