一些面试题
CSS
flex: 1; 什么意思
- flex 是 flex 布局中子项的属性;
- flex 是 flex-grow, flex-shrink, flex-basis 三属性的缩写;
- flex: 1;展开为三属性表示: flex-grow: 1; // 放大时以 1 为相对倍数 flex-shrink: 1; // 缩写时以 1 为相对倍数 flex-basis: 0%; // 放大缩小基础尺寸
CSS 的盒子模型
css 盒子模型有两种: 标准盒模型 和 IE 盒子模型 标准盒子模型 (四个部分): margin + border + padding + content IE 盒子模型(两个部分): margin + content( border + padding + content )
display: none;与 visibility: hidden;的区别
display: none; 是不占用位置的 visibility: hidden; 虽然隐藏了,但是占用位置(visibility:看不见)
visibility: hidden; 、 display: none; 产生重绘 display: none; 还会产生一次回流
JS
JS 数据类型
基本类型:string number boolean undefined null; bigint symbol
引用类型:object
深拷贝和浅拷贝
- 都是对象(数据)复制
- 浅拷贝只复制栈空间
- 深拷贝在基本数据复制栈空间,在引用数据复制堆空间
- 实现深拷贝方法:1. JSON 方法 2. 遍历对象属性
React 类组件生命周期(最新)
Render 阶段:用于计算一些必要的状态信息。这个阶段可能会被 React 暂停,这一点和 React16 引入的 Fiber 架构(我们后面会重点讲解)是有关的;
Pre-commit 阶段:所谓“commit”,这里指的是“更新真正的 DOM 节点”这个动作。所谓 Pre-commit,就是说我在这个阶段其实还并没有去更新真实的 DOM,不过 DOM 信息已经是可以读取的了;
Commit 阶段:在这一步,React 会完成真实 DOM 的更新工作。Commit 阶段,我们可以拿到真实 DOM(包括 refs)。
挂载过程:
constructor getDerivedStateFromProps render componentDidMount
更新过程:
getDerivedStateFromProps shouldComponentUpdate render getSnapshotBeforeUpdate componentDidUpdate
卸载过程:
componentWillUnmount
React.Component 和 React.PureComponent 的区别
PureComponent 表示一个纯组件,可以用来优化 React 程序,减少 render 函数执行的次数,从而提高组件的性能。
在 React 中,当 prop 或者 state 发生变化时,可以通过在 shouldComponentUpdate 生命周期函数中执行 return false 来阻止页面的更新,从而减少不必要的 render 执行。React.PureComponent 会自动执行 shouldComponentUpdate。
不过,pureComponent 中的 shouldComponentUpdate() 进行的是浅比较,也就是说如果是引用数据类型的数据,只会比较不是同一个地址,而不会比较这个地址里面的数据是否一致。浅比较会忽略属性和或状态突变情况,其实也就是数据引用指针没有变化,而数据发生改变的时候 render 是不会执行的。如果需要重新渲染那么就需要重新开辟空间引用数据。PureComponent 一般会用在一些纯展示组件上。
使用 pureComponent 的好处:当组件更新时,如果组件的 props 或者 state 都没有改变,render 函数就不会触发。省去虚拟 DOM 的生成和对比过程,达到提升性能的目的。这是因为 react 自动做了一层浅比较。
常用 React Hook
- useState、useReducer、useContext、useMemo、useCallback、useEffect、useRef…
useMemo、useCallback 使用场景
- 性能优化
React 触发组件更新的原因
- 父组件更新
- state 更新
- forceUpdate
JS 微任务和宏任务
- js 是单线程的语言
- js 同步的任务都执行完了,才会执行事件循环的内容
- 进入事件循环:微任务、宏任务
- 微任务:promise.then
- 宏任务:setTimeout、setInterval、事件…
JS 作用域
- 有全局作用域、函数作用域、块级作用域
- 作用域链:内部可以访问外部的变量,但是外部不能访问内部的变量;如果内部有,优先查找到内部,如果内部没有就查找外部的。
闭包
- 闭包是函数和函数的词法环境的组合;
- 闭包中的变量就是函数词法作用域上的所有被引用的变量
- 闭包可以让函数执行完以后变量内存不被浏览器回收
- 闭包可以用于封装私有变量
- 闭包变量常驻内存、容易内存溢出
原型链
- 原型链是把原型串联起来的一种类似链表的链(原型 + 链)
- 原型是一个对象;是构造函数的一个特有属性,构造函数实例对象可以通过
__proto__属性引用到原型对象 - 对象的属性方法查找优先顺序:对象本身查找 -> 原型对象查找 -> 原型对象的原型对象查找 -> 原型对象的原型对象的原型对象查找 … -> null
- 原型链的最顶端是 null
new 操作符具体做了什么
- 创建了一个空的对象
- 将空对象的原型,指向于构造函数的原型
- 将空对象作为构造函数的上下文(改变 this 指向)
- 对构造函数有返回值的处理判断