「前端」招银网络科技一面(已约线下二面)
- 你提到重新封装了axios,你具体是怎么做的?
- 解释了一下就是封装了一些get请求,post请求,拼接url之类的函数,项目用的时候不用裸写url了
- (这个点俩月下来了从来没人问,这两天疯狂被问,我已经打算把这条撤下来了,毕竟重新封装别人一问就是拼了个url有点幽默了🤣)
- 后端返回的错误码有做处理吗?
- 响应拦截器,拿到错误之后直接前台弹对应的错误信息
- 响应式布局中的单位以及区别
- vw vh rem em,八股复读
- 项目中实际遇到的困难
- 前面提到了防抖,这里又问了一下节流
- 前面提到你用useRef存计时器id,那可以干什么,可以拿到最新值吗
- 可以用来保持对DOM元素的引用,.current永远是最新的
- 除了能拿到最新的值以外,useRef跟useState有什么区别?
- 后者会触发视图重新渲染,前者不会
- 了解类组件吗
- 讲了一下自己学的时候已经在写函数组件了,但是还是介绍了一下类组件的生命周期,为什么类组件不用了,现在的函数式组件又是怎么替代原来的生命周期中的一些行为的
- 你提到 useState 是异步更新的,那具体过程是什么样的?(准备过的问题,爽!)
- React将一次渲染分为两个阶段:render (Reconciler 工作), commit (Renderer 工作),具体来说:
- Render 阶段(可以打断)
- setState 创建一个 update,将 Update 对象入队到 updateQueue 中
- Scheduler 查看是否有更高优先级的任务,并将创建的更新加入任务队列,等待调度
- 在 requestIdleCallback 空闲时执行任务
- 从根节点开始遍历 FiberNode,并且构建 WorkInProgress Tree (用于处理 FiberNode 中间状态)
- Reconciler(协调器) 阶段生成 EffectList(用于纪录副作用,比如 DOM 更新,生命周期方法等)
- Commit 阶段(不可打断)
- Renderer 根据 effectList 对 DOM 进行实际更新
- Render 阶段(可以打断)
- React将一次渲染分为两个阶段:render (Reconciler 工作), commit (Renderer 工作),具体来说:
- 你提到了Fiber,那Fiber架构里面有什么东西?
- Stack Reconciler → Fiber Reconciler
- 使用FiberNode管理节点信息/状态等
- 介绍一下Fiber Tree中的双缓存
- 没听过这个词儿,有点懵,答非所问了
- 去网上一搜,结果就是前面说过的东西,就是一个实际的current tree,一个Work Tree,Work Tree完成计算后去跟current tree进行diffing,然后把差异patch上去
- redux 的原理
- 响应式部分跟state一样,不同的部分是 redux 的数据并不存储在 React 中,所以需要通讯,可以借助 react-redux 的
connect
或useSelector
来通知 React 组件发生改变
- 响应式部分跟state一样,不同的部分是 redux 的数据并不存储在 React 中,所以需要通讯,可以借助 react-redux 的
- useContext是干什么用的
- 下面开始问八股了
- js中的数据类型
- Number的精度丢失以及如何解决
- undefined和null的区别
- 隐式类型转换是什么
- 如何进行显式类型转换
- 如何区分一个object具体是function还是array
- 闭包
- 内存泄露
- 垃圾回收机制
- 又问回到项目相关,打包的时候做过什么优化?
- 利用了一些Tree-shaking之类的特性
- 部分包可以通过CDN提供
- 如何进行性能优化
- ts中的泛型是什么
- 什么是泛型约束
-
这个当时确实没答上来,毕竟ts用的少
-
就是除了class可以extends,泛型T也可以extends一个对象或者一个接口,那这个泛型就必须包含这个对象/接口中的属性,比如
function logLength<T extends { length: number }>(item: T): void { console.log(item.length); }
这个函数传入的参数必须是一个对象,需要包含number类型的length属性
-
- 类型断言是什么
- 明确告诉编译器一个变量的类型
- 什么是工具类型
- 没答出来
- 用于对现有的类型进行转换,比如Partial,将类型中的所有属性变为可选,Required变为必选