目录

前端面试

前端面试

https://wuhaohao1234.github.io/resume-arco/

https://juejin.cn/post/6871956933775982606#heading-65

https://juejin.cn/post/6844904166742048782#heading-4

https://juejin.cn/post/6844904160719011848#heading-21

https://github.com/wuhaohao1234/coder-docs/blob/main/%E5%89%8D%E7%AB%AF%E9%9D%A2%E8%AF%95%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99.md

https://juejin.cn/post/6844904093492707336

链接说明

朋友链接 https://www.yuque.com/abu0418/uf2dbz/gqwnmm

内部链接 https://www.yuque.com/abu0418/kb/crk4dm

旧博文

必备技巧

输入url 发生 xxx

知识体系js

知识体系vue

常用

闭包

一个function里面return了一个子函数,子函数访问了父函数的变量。

可以访问自由变量的函数

防抖 节流

防抖:一段时间只运行一次

节流:而函数节流是间隔时间执行,不管事件触发有多频繁

一般由服务器生成,可设置失效时间。如果在浏览器端生成Cookie,默认是关闭浏览器后失效

4k

每次都会携带在HTTP头中,如果使用cookie保存过多数据会带来性能问题

主要用途有保存登录信息,比如你登录某个网站市场可以看到“记住密码”,这通常就是通过在 Cookie 中存入一段辨别用户身份的数据来实现的。

localStorage sesstionStorage

localstorage 除非被清除,否则永久保存

sessionStorage 仅在当前会话下有效,关闭页面或浏览器后被清除

仅在客户端(即浏览器)中保存,不参与和服务器的通信

5mb

vue 生命周期

created 发生在实例创建完成后,当前阶段已经完成了数据观测,也就是可以使用数据,更改数据,在这里更改数据不会触发updated函数。可以做一些初始数据的获取,在当前阶段无法与Dom进行交互(因为Dom还没有创建),如果非要想,可以通过vm.$nextTick来访问Dom。

beforeMount发生在挂载之前,在这之前template模板已导入渲染函数编译。而当前阶段虚拟Dom已经创建完成,即将开始渲染。在此时也可以对数据进行更改,不会触发updated。

mounted发生在挂载完成后,在当前阶段,真实的Dom挂载完毕,数据完成双向绑定,可以访问到Dom节点,使用$refs属性对Dom进行操作。

beforeUpdate发生在更新之前,也就是响应式数据发生更新,虚拟dom重新渲染之前被触发,你可以在当前阶段进行更改数据,不会造成重渲染。

updated发生在更新完成之后,当前阶段组件Dom已完成更新。要注意的是避免在此期间更改数据,因为这可能会导致无限循环的更新。

beforeDestroy发生在实例销毁之前,在当前阶段实例完全可以被使用,我们可以在这时进行善后收尾工作,比如清除计时器,销毁父组件对子组件的重复监听。beforeDestroy(){Bus.$off(“saveTheme”)}

destroyed发生在实例销毁之后,这个时候只剩下了dom空壳。组件已被拆解,数据绑定被卸除,监听被移出,子实例也统统被销毁。

react生命周期

Initialization 初始化

constructor() : class 的构造函数,并非React独有

Mounting 挂载

componentWillMount() : 在组件即将被挂载到页面的时刻自动执行; render() : 页面挂载; componentDidMount() : 组件被挂载到页面之后自动执行;

componentWillMount() 和 componentDidMount(),只会在页面第一次挂载的时候执行,state变化时,不会重新执行 Updation 组件更新

shouldComponentUpdate() : 该生命周期要求返回一个bool类型的结果,如果返回true组件正常更新,如果返回false组件将不会更新; componentWillUpdate() : 组件被更新之前执行,如果shouldComponentUpdate()返回false,将不会被被执行; componentDidUpdate() : 组件更新完成之后执行;

componentWillReceiveProps() : props独有的生命周期,执行条件如下:

组件要从父组件接收参数; 只要父组件的render()被执行了,子组件的该生命周期就会执行; 如果这个组件第一次存在于父组件中,不会执行; 如果这个组件之前已经存在于父组件中,才会执行;

Unmounting 组件卸载

componentWillUnmount() : 当组件即将被从页面中剔除的时候,会被执行;

hash history

hash 路由:监听 url 中 hash 的变化,然后渲染不同的内容,这种路由不向服务器发送请求,不需要服务端的支持;

history 路由:监听 url 中的路径变化,需要客户端和服务端共同的支持

一个带#,一个不带

hash 是可以做单页面应用

this指向

es5 指向调用者

es6 指向所处环境

EventLoop 事件循环

执行一个宏任务(栈中没有就从事件队列中获取) 执行过程中如果遇到微任务,就将它添加到微任务的任务队列中 宏任务执行完毕后,立即执行当前微任务队列中的所有微任务(依次执行) 当前宏任务执行完毕,开始检查渲染,然后GUI线程接管渲染 渲染完毕后,JS线程继续接管,开始下一个宏任务(从事件队列中获取)

同步代码 宏任务 微任务 异步代码 宏任务 微任务

macrotask:主代码块,setTimeout,setInterval等(可以看到,事件队列中的每一个事件都是一个macrotask)

microtask:Promise,process.nextTick等

BFC IFC

bfc

在块格式化上下文中,每一个元素左外边与包含块的左边相接触(对于从右到左的格式化,右外边接触右边),即使存在浮动也是如此(所以浮动元素正常会直接贴近它的包含块的左边,与普通元素重合),除非这个元素也创建了一个新的BFC。

内部 box在垂直方向,一个接一个的放置

box的垂直方向由 margin决定,属于同一个BFC的两个box间的margin会重叠

BFC区域不会与 floatbox重叠(可用于排版)

BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此

计算BFC的高度时,浮动元素也参与计算(不会浮动坍塌)

ifc

IFC即行内框产生的格式上下文。

浮动元素可能会处于包含块边缘和行框边缘之间,尽管在相同的行内格式化上下文中的行框通常拥有相同的宽度(包含块的宽度),它们可能会因浮动元素缩短了可用宽度,而在宽度上发生变化。

同一行内格式化上下文中的行框通常高度不一样(如,一行包含了一个高的图形,而其它行只包含文本),当一行中行内框宽度的总和小于包含它们的行框的宽,它们在水平方向上的对齐,取决于 text-align 特性。空的行内框应该被忽略。

即不包含文本,保留空白符,margin/padding/border非0的行内元素,以及其他常规流中的内容(比如,图片,inline blocks 和 inline tables),并且不是以换行结束的行框,必须被当作零高度行框对待。

行内元素总是会应用IFC渲染规则

行内元素会应用IFC规则渲染,譬如 text-align可以用来居中等

块框内部,对于文本这类的匿名元素,会产生匿名行框包围,而行框内部就应用IFC渲染规则

行内框内部,对于那些行内元素,一样应用IFC渲染规则

另外, inline-block,会在元素外层产生IFC(所以这个元素是可以通过 text-align水平居中的),当然,它内部则按照BFC规则渲染

react组件通信

父子组件 props 自定义事件 Redux 和 Context,简单数据用 Context

常用hooks

usememo和usecallback

useMemo 和 useCallback 接收的参数都是一样,都是在其依赖项发生变化后才执行,都是返回缓存的值,区别在于 useMemo 返回的是函数运行的结果, useCallback 返回的是函数

git rebase merge

通过merge合并分支会新增一个merge commit,然后将两个分支的历史联系起来

其实是一种非破坏性的操作,对现有分支不会以任何方式被更改,但是会导致历史记录相对复杂

rebase会将整个分支移动到另一个分支上,有效地整合了所有分支上的提交

主要的好处是历史记录更加清晰,是在原有提交的基础上将差异内容反映进去,消除了 git merge所需的不必要的合并提交

reflow&repaint 重绘 重排

重绘:某些元素的外观被改变,例如:元素的填充颜色 重排:重新生成布局,重新排列元素。

solid 原则

Single Responsibility Principle:单一职责原则 Open Closed Principle:开闭原则 Liskov Substitution Principle:里氏替换原则 Law of Demeter:迪米特法则 Interface Segregation Principle:接口隔离原则 Dependence Inversion Principle:依赖倒置原则

webpack优化

https://jishuin.proginn.com/p/763bfbd64177