前端面试

178 阅读6分钟

1.vue 1.1真实dom,虚拟dom渲染原理,diff算法如何理解,渲染过程,生命周期的什么阶段,Key的作用

真实dom上ast生成,vdom是一个js对象,diff算法对比过程?更新dom触发render函数,通过diff算法,getter方法会被调用,setter通知wather组件实例,进行页面的重绘,回流。created声明周期dom没有生成,但是有实例的this,mounted函数可以获取真实dom。

key的作用作为唯一标识,来进行内容改变的时候,真实dom进行更新

    为什么不能用inde作为key,做数据进行逆序增加,删除的时候会没必要的更新,或者进行输入类的dom的时候界面显示有问题

    如果内容不改变,只是dom的顺序改变,vue将会怎么更新渲染?

vue是异步更新dom,按照一定的策略更新,什么策略?vue中的数据更新不是立即的,而是异步更新,意味着数据变化的所有事件会进入一个队列之中,wacther的多次触发,只会进入队列一次,然后在下一次是事件循环里面vue会进行队列的执行,并且刷新队列。

1.2异步方面,nexttick使用,整个事件循环的机制,过程

事件循环可以理解为js是单线程的,一次只能执行一个任务,当多个任务同时执行,会导致阻塞,把数据等计算过程较慢的进行异步队列,等主线程代码块执行完,再执行队列任务,再循环执行点击事件,以及后续的异步任务。

1.3数据传递方面,vuex,pinia区别

vuex中的state的作用,用于存放组件之间共享的数据。单一的状态树,可以传递给所有的父子组件。每个应用只有一个实例,vuex可以获取组件在任何状态下的快照。

vuex::mvvm架构,发布监听者的模式,state->getter()=>mutation(commit('xxx'))->action(dispatch({}))->改变state->view

pinia:state->getter->action 可以直接改变state. 更轻量化,简洁 storeToRefs进行数据结构

$patch 进行多个state同时修改

1.4vue实现按需加载路由或者组件

webpack中提供了require.ensure( )来实现按需加载

requrie.ensure([],()=>require('src'))

1.5data为什么是一个函数

保证函数是独立可复用的,每次实例化一个组件的时候,都是可以生成一个data对象的,相互之间不干扰。

1.6如何用vue-cli自定义组件

1,定义组件

2,import 导入组件,传递参数喝方法

3,components定义组件,在template引入

4,全局组件vue.component()

1.7watch和computed的区别

区别 watch computed 场景 一个数据影响多个数据 一个数据受到多个数据影响 功能 不需要return 必须return 缓存 没有缓存 有缓存 初始化 添加immediate:true 默认立即执行 是否异步 支持 不支持 功能 监听 计算属性 1.8vue的响应式的系统是怎么样的

每个vue组件都有一个与之对应的watcher实例,vue的data上的属性会被添加到getter,setter中,然后进行所有变动的data的依赖收集,通知每个依赖的data的组件调用render方法进行更新

v-model 父子组件中的使用

slot插槽的使用

1.9性能优化方面

1,http减少请求数

2,组件封装

3,js写在后面,html,css写在前面

4,压缩

5,缓存

6,打包优化

7,工程管理

8,可复用,低耦合高内聚,降本增效

9,懒加载,预加载

10,路由懒加载

11,cdn技术,iconFont图标

1.10模块化

5,amd 异步打包机制 js前端 define(['dep1', 'dep2'],function(dep1,dep2){

return function(){} })

6,cmd 同步的 moudle.exports= {} require() js后端

7,umd 通用模块定义 webpack打包机制 umd

8,esm es6打包机制 esm import export

1.11算法

1,冒泡排序,快速排序算法

2,数组、字符串、链表、栈、队列、哈希表、二叉树、堆、递归、深搜广搜、动态规划基础题,最好每个类型做几道常见题练练手感

3,浏览器获取地址栏参数

4,反转数字

5,数组降纬

6,回文字符串

7,场景题:数字递增,暂停,继续功能;函数式组件实现井子棋

8,状态提升,

1.12协议

http协议

tcp协议 三次握手 四次挥手

1,客服端发送 syn=1 seq =x 服务端 发送ack = x +1 syn=1 seq= y 客服端发送ack报文 ack=y+1 syn=0 seq =z

2,主动方 发送 fin=1 seq =x ack = z 被动方发送ack = x +1 seq =z 被动方再发送 ack = y fin =1 seq = z 主动方发送 ack = y seq = x

为什么是三次握手不能是两次?

    防止攻击,防止发生死锁

为什么是四次挥手?

    防止数据包丢失,FIN和ACK报文是分开发送的

等待2msl才CLOSED?

    等待发送数据包完成,防止重复在在旧ip和端口建立重复的分组

各网络层对应的工作设备: 物理层:中继器、集线器 数据链路层:网桥或交换机 网络层中继系统:路由器 网络层以上的中继系统:网关

1.13Websocket

1,全双工的协议

2,如何进行心跳监听

3,有线网切换wifi是否断开,wifi切换有线网是否断开

4,原理是什么

1.14路由守卫

1,hash路由和history路由的区别

2,全局路由守卫和各个子组件的路由守卫是什么?哪些路由守卫是各自独有的?

3, 路由的原理是什么

2.react 2.1事件处理机制,事件委托

事件机制。捕获 冒泡 目标 事件冒泡到document地方,react进行重写了事件默认冒泡方式,使用dispatchEvent进行事件派发,systheicEvent总的事件委托,事件冒泡和事件捕获的区别?react怎么实现事件捕获,默认是事件冒泡。

2.2dom渲染过程

1,jsx语法 底层是react.createElement() ,

2,递归渲染和fiber架构渲染的区别?

3,怎么做渲染的性能优化?

4,scu和hooks语法分别怎么去做组件的性能优化?

5,scheduler.postTask的实现过程和兼容性问题

6,requestIdleCallback是干嘛的?接受的参数和作用?

2.3函数式组件。hooks

1,函数式组件和class组件的对比?

2,useMemo和react.memo的区别

3,useEfffect和useLayoutEffect的区别

4,怎么优化性能,useMemo和useCallBack如何使用

5,数据是如何保存的?如何更新的?底层实现过程是怎么样的?

6,react生命周期的UNSAFE_前缀的含义?为什么导致重复渲染?导致死循环?

7,getSnapshotBeforeUpdate的作用?与componentDidUpdate的关系?

8,

2.4react架构的原理

1,数据层面的架构变化(实现方式是什么?)

2,渲染层面的性能提升

3,声明周期方面的控制

4,数据传递方面的优化

5,HOC和组合式组件的区别?

2.5redux的原理和实现过程

1,mvvm和mvc的区别

2,redux实现异步

3,redux和react-redux的区别

4,connect高阶组件接受的参数和作用