1. 声明变量的几种方式?var const let
- 变量声明提升
- var 有变量声明提升的功能,可以先使用然后再声明,反之也成立
- let const 没有此功能,必须要先声明才能使用
- 重复声明
- var 可以重复声明,后者覆盖前者
- let const 则不能重复声明
- 作用域范围
- var 的作用域是以函数为界限
- let const 是块作用域
- var 可以定义全局变量和局部变量,let const 只能定义局部变量
- const 的特殊之处
- 声明之后不能被修改(常量)
2. 解决异步的几种方式和区别
- 回调函数:容易造成回调地狱
- Promise:使用微任务队列驱动,使用管道式处理,链式调用
- generater 函数
- async/await:可以讲异步事件使用同步的语法来处理,是 generater 函数的语法糖
3. for 循环和 forEach 的区别
- 都可以遍历数组集合,for在复杂循环中效率更高
- forEach 不可以删除、修改集合元素,而 for 可以
- 都可以修改元素里面的属性
- for 可以中断循环(使用 break 或 return),forEach 不可以中断
4. forEach 和 map 的区别
- map 会分配内存空间存储新数组并返回,forEach 不会返回数据,是undefined
- forEach允许callback更改原始数组的元素,map返回新的数组
5. 浏览器缓存
- 强缓存 (200)Expires Cancel-Control
- 协商缓存 (304)
6. 事件循环的理解
js 是单线程语言,同一时间内只能做一件事,而实现单线程非阻塞的方式就是事件循环。
所有任务可以分为 同步、异步任务。同步任务是立即执行的任务,一般会直接进入到主线程中执行。异步任务进入任务队列,主线程的任务执行完毕为空,会去任务队列中读取对应的任务,推入主线程执行。
7. 如何看待加班问题
如果项目紧急的话,肯定是不可避免的。无效加班只是为了形式而已
太原 21 人,前端5个,预计招1,2人,后端太原6个,北京3个。UI 1个,3个测试。
React + Ts 医疗
8. interface 和 type 区别
- type 可以描述所有数据,只是一个类型别名;interface 只能描述对象,是类型声明
- type 不可重新赋值,尽量对内;interface 会自动合并,对外使用,方便扩展
9. 泛型
- 在定义函数、接口或者类的时候,不预先指定具体的类型,而是在使用的时候再指定类型的一种特性
- 提高代码的可重用性,使用泛型来创建可重用的组件,一个组件可以支持多种类型的数据
10. 面试中我回答的问题,你感觉哪些方面比较薄弱,需要加强提高的
11. js 防抖节流
12. this 指向
13. 双向绑定的实现原理
14. 视图不更新
绑定的数据没有响应化,可能是新增属性,需要手动通过 $set 设置
15. 父子组件生命周期顺序
- 加载渲染过程:父beforeCreate —> 父created —> 父beforeMount —> 子beforeCreate —> 子created —> 子beforeMount —> 子mounted —> 父mounted
- 子组件更新过程:父beforeUpdate —> 子beforeUpdate —> 子updated —> 父updated
16. 闭包
有权访问另一个函数作用域中的变量的函数;一般情况就是在一个函数中包含另一个函数。
- 隐藏变量,避免全局污染
- 可以读取函数内部的变量
17. 继承
- 原型链继承
- 借用构造函数继承(伪造对象、经典继承)
- 实例继承(原型式继承)
- 组合式继承
- 寄生组合继承
- es6继承
18. 组件通信方式(vue、React)
- $attrs $listener $parent $children $root props/emit vuex pinia eventBus provide/inject
- react: props ref 回调函数 context redux mobx
19. react 的 hooks 钩子
- useState
- useEffect 生命周期管理
- useContext
- useRef
- useMemo
- useCallback
- useReducer
- useLayoutEffect 完成副作用操作,会阻塞浏览器绘制
useEffect:
- 不传值:第一次渲染以及每次更新渲染后都执行
- 空数组:第一次渲染后执行一次
- 基本类型:第一次渲染以及每次更新渲染后都执行