今天在秋招提前批浪潮到来的压力下,小心翼翼地将我的简历投送到了各大招聘App,苦苦等待了半天,终于得来了一个宝贵的面试机会,是四川的一家游戏互联网公司,在到了进入腾讯会议的时间,开始瑟瑟发抖了,因为自身的实力还是不够看。
直接来看看今天的题目吧!!
进入面经
一、自我介绍
这个不用多说了,主要就是我是xxx,来自xx学校xx专业,主修课程有哪些... 对AI比较感兴趣,在做项目时有调用一些aigc的api接口,比如openai,coze。在coze的一个AI工坊的活动里也获得了一些成绩,学习了Vue框架,了解React,用React做过项目,总共做过三个项目,一个纯前端的项目,一个前后端分离的全栈项目,还有一个React+ts的项目。
二、自己的大模型怎么训练?
面试官:听说你对AI感兴趣,蛮了解的。问问你如果你有一个大模型,你该怎么训练它? 我:what the fk?我不生产水,我只是大自然的搬运工...平时只会用AI的我,第一个问题就被问倒了,我回答的是优化prompt,对提示词进行细化,给出明确和详细的提示词,对AI进行分步提问,还有就是ai的反馈迭代,通过ai给出的反馈进行调整提示词,再优化迭代版本。 具体大模型怎么训练可以看看这篇文章:仅用61行代码,你也能从零训练大模型 - 掘金 (juejin.cn)
三、Vue3对于Vue2的区别
这个老生常谈的问题了,虽然Vue2没用过,但是这个是面试常见题,一定要牢牢拿住。 这里我总结了以下七点:
1.根节点不同 : Vue2必须要有根节点,Vue3中可以没有根节点,会默认将多个根标签包裹在一个fragement虚拟标签中,有利于减少内存。
2.组合式API和选项式API Vue2是数据和函数集中处理,将功能点切割,不利于代码可读性 Vue3可读性、维护性更强。
3.生命周期的变化 创建前:beforeCreate -> 使用setup() 创建后:created -> 使用setup() 挂载前:beforeMount -> onBeforeMount 挂载后:mounted -> onMounted 更新前:beforeUpdate -> onBeforeUpdate 更新后:updated -> onUpdated 销毁前:beforeDestroy -> onBeforeUnmount 销毁后:destroyed -> onUnmounted 异常捕获:errorCaptured -> onErrorCaptured
4.v-if和v-for的优先级不同 这里就不细讲了,主要是Vue3的v-if优先级更高,Vue2优先级是一样的。所以在Vue3中v-if是不可以与v-for一起用的。
5.响应式原理不同 ①Vue2主要是通过Object.definedProperty()
②Vue3主要是通过Proxy代理,不需要像Object.definedProperty()的那样遍历每一个属性,有一定的性能提升proxy可以理解为在目标对象之前架设一层"拦截"外界对该对象的访问都必须通过这一层拦截。这个拦截可以对外界的访问进行过滤和改写。
6.更小的体积 Tree-shaking 支持:Vue 3 代码更容易被 Tree-shaking 优化,因此可以更好地剔除不需要的代码。
7.更好的ts支持 vue3的代码库完全采用了重写后的ts,提供更好的类型推断和类型提示。
四、讲讲你自己封装的几个组件,以及它实际应用中的扩展性
这里我讲的对大家没什么参考性,我就只讲了一个axios的封装和另一个iconfont组件的一个symbol引用方式加载的一个封装。 拓展性这里可以讲到这几个点:
- 复用性
- 独立性
- 可组合性
- 易于测试
- 解耦合
- 可替换性
- 社区共享
- 性能优化
五、封装axios你是怎么封装的
因为前面讲到封装的组件里有axios,这里我就讲到创建一个
axios
的实例,并设置一些全局的默认配置,如基础URL、超时时间、请求头等, 封装了axios的请求拦截,响应拦截,在axios的请求拦截中我在请求头中放了后端给我的token,用于鉴定用户权限。响应拦截这里就是做了一个先是对后端返回的一个状态码进行判断,如果状态码不对,此时说明服务器端出问题了,这样可以更清晰地排查整个项目哪个节点出了问题,然后就是对返回的数据也就是响应体进行一个判断,因为我的项目里的这个响应体在鉴权时,会产生一些自定义状态码来判断后端可能出现的一些逻辑性的错误,这些都会在响应拦截中被拦截下来,如果响应体带回来的状态码是属于错误的,那么响应拦截会将其拦截下来,并且在控制台输出错误信息。
其实这里也可以说一说,封装了axios的get、post、put、delete方法。
六、如果你的token在你发送请求时失效,如何让请求截停
面试官问到这个问题,我就完全没有头绪了,因为之前没有经历过这种情况,在项目中一般前后端交互的响应时间是很短的,可能不到半秒就返回响应了,而在我们项目的设计中我设置的token时长比较长,所以没有想到过这个问题,所以一问我就懵逼了,而且在上面我也讲了响应拦截,所以我觉得这个问题应该跟响应拦截没有什么关联。
但是这里应该是可以用响应拦截来处理的,只需要在后端中编写处理这个错误的逻辑,并给一个错误的状态码让响应体带上,这样前端就可以接受到这个响应拦截了。
七.有没有用react和ts做过项目
这里没有深问,就只回答了做过,有项目的经验,就没有追问了。
八、如何鉴定用户权限,使用自定义指令鉴定用户权限展示不同的标签
这个答案可以参考: Vue中后台鉴权 - 自定义指令实现权限颗粒化 - 掘金 (juejin.cn)
九、讲讲promise的原理
Promise
是 JavaScript 中用于异步编程的一种解决方案,它提供了一种更优雅的方式来处理异步操作,避免了回调地狱(callback hell)的问题。Promise
设计的核心理念是将异步操作的结果封装在一个对象中,这个对象代表了一个最终会在未来完成的操作,并且会持有这个操作的结果值。
Promise 的状态
Promise
对象有三种状态:
- Pending(等待中) :初始状态,既没有被解决(resolved)也没有被拒绝(rejected)。
- Fulfilled(已解决) :异步操作成功完成,此时
Promise
被标记为 resolved,并附带一个结果值。- Rejected(已拒绝) :异步操作失败,此时
Promise
被标记为 rejected,并附带一个错误信息。一旦
Promise
的状态变为 fulfilled 或 rejected,这个状态就不会再改变,这种特性被称为"不可变性"。Promise 构造函数
Promise
是一个构造函数,用于创建一个新的Promise
实例。它接受一个执行器函数(executor function)作为参数,这个函数会在Promise
创建时立即执行,且接收两个参数:resolve
和reject
,它们都是函数,用于改变Promise
的状态。
这里就不讲它的代码了,篇幅有点长,答到前面大概就差不多了。
十.有什么想问的
这里差不多就结尾了,可能前面答的不行,毕竟第一次面试确实还是会有点紧张,有些东西一下紧张想不起来,但是还是从这次面试中学到了挺多的。
等我习惯这种被拷打的感觉,应该慢慢地就会很爽!