前端面试题总结(五)

目录

1.说说你对react的理解?有哪些特性?

2.说说Real diff算法是怎么运作的?

3.说说React生命周期有哪些不同的阶段?每个阶段对应的方法是?

 4.说说你对React中虚拟dom的理解?

5. 说说你对react hook的理解?

6.React组件之间如何通信?

 7.说说你对受控组件和非受控组件的理解?应用场景?

8.说说Connect组件的原理是什么?

 9.说说react 中jsx语法糖的本质?

10.说说你对redux中间件的理解?常用的中间件有哪些?实现原理?

11.说说AMD、CMD、commonJS模块化规范的区别?

 12.说说package.json中版本号的规则?

13.说说React jsx转换成真实DOM的过程?

 14.说说你对@reduxjs/toolkit的理解?和react-redux有什么区别?

15.React render方法的原理,在什么时候会触发?

16.React性能优化的手段有哪些?

17.如何通过原生js实现一个节流函数和防抖函数? 

 18.说说你对koa中洋葱模型的理解?

19.说说如何借助webpack来优化前端性能?

 20.说说你对webSocket的理解

1.说说你对react的理解?有哪些特性?

React,用于构建用户界面的 JavaScript 库,只提供了 UI 层面的解决方案

遵循组件设计模式、声明式编程范式和函数式编程概念,以使前端应用程序更高效

使用虚拟 DOM 来有效地操作 DOM,遵循从高阶组件到低阶组件的单向数据流

帮助我们将界面成了各个独立的小块,每一个块就是组件,这些组件之间可以组合、嵌套,构成整体页面

react 类组件使用一个名为 render() 的方法或者函数组件return,接收输入的数据并返回需要展示的内容

 特性:

JSX 语法

单向数据绑定

虚拟 DOM

声明式编程

Component

2.说说Real diff算法是怎么运作的?

React 采用的是虚拟 DOM (即 VDOM ),每次属性 (props) 和状态 (state) 发生变化的时候,render 函数返回不同的元素树,React 会检测当前返回的元素树和上次渲染的元素树之前的差异,然后针对差异的地方进行更新操作,最后渲染为真实 DOM,这就是整个 Reconciliation 过程,其核心就是进行新旧 DOM 树对比的 diff 算法。

3.说说React生命周期有哪些不同的阶段?每个阶段对应的方法是?

一共有三个阶段,分别为

挂载阶段(Mounting)

更新阶段(Updating)

卸载阶段(Unmounting

挂载阶段:

- constructor() 在 React 组件挂载之前,会调用它的构造函数。

- componentWillMount: 在调用 render 方法之前调用,并且在初始挂载及后续更新时都会被调用。

- componentDidMount(): 在组件挂载后(插入 DOM 树中)立即调用

更新运行阶段:

* componentWillReceiveProps: 在接受父组件改变后的props需要重新渲染组件时用到的比较多,外部组件传递频繁的时候会导致效率比较低

* shouldComponentUpdate():用于控制组件重新渲染的生命周期,state发生变化,组件会进入重新渲染的流程,在这里return false可以阻止组件的更新

* render(): render() 方法是 class 组件中唯一必须实现的方法。

* *componentWillUpdate(): shouldComponentUpdate返回true以后,组件进入重新渲染完成之前进入这个函数。

* **componentDidUpdate(): 每次state改变并重新渲染页面后都会进入这个生命周期

卸载或销毁阶段

componentWillUnmount (): 在此处完成组件的卸载和数据的销毁。

 4.说说你对React中虚拟dom的理解?

虚拟 DOM 不会进行排版与重绘操作,而真实 DOM 会频繁重排与重绘

使用虚拟 DOM 的优势如下:

如果使用手动操作真实 DOM 来完成页面,繁琐又容易出错,在大规模应用下维护起来也很困难

性能方面:使用 Virtual DOM,能够有效避免真实 DOM 数频繁更新,减少多次引起重绘与回流,提高性能

跨平台:React 借助虚拟 DOM,带来了跨平台的能力,一套代码多端运行

5. 说说你对react hook的理解?

React中的Hook方法:

useState()用于为函数组件引入状态。在useState()中,数组第一项为一个变量,指向状态的当前值。类似this.state,第二项是一个函数,用来更新状态,类似setState

useEffect()接受两个参数,第一个参数是你要进行的异步操作,第二个参数是一个数组,用来给出Effect的依赖项。只要这个数组发生变化,useEffect()就会执行

useRef():

相当于class组件中的createRef的作用,ref.current获取绑定的对象

UseReducer():

接受reducer函数和状态的初始值作为参数,返回一个数组,其中第一项为当前的状态值,第二项为发送action的dispatch函数

UseMemo()和useCallback():

接收的参数都是一样,第一个参数为回调,第二个参数为要依赖的数据

共同作用:仅仅依赖数据发生变化, 才会调用,也就是起到缓存的作用。useCallback缓存函数,useMemo 缓存返回值。

6.React组件之间如何通信?

  1. 通过props进行父子组件通信
  2. 使用路由跳转传参
  3. 将数据本地化存储通信
  4. 使用redux实现数据状态统一管理
  5. 使用publish发布与订阅

 7.说说你对受控组件和非受控组件的理解?应用场景?

受控组件:

由React控制输入表单的元素而改变其值的方式

例如:给表单input绑定一个onChange事件,当input状态发生变化就会触发这个事件,从而更新state的变化

非受控组件:

它的表单数据由dom本身处理,不受setState控制,和传统的html相似,输入什么就会显示最新的值在非受控组件中可以使用ref来从dom获取表单数据

8.说说Connect组件的原理是什么?

connect有四个参数, 但是后两个参数用到的很少.

connect 的第一个参数是 mapStateToProps

这个函数允许我们将 store 中的数据作为 props 绑定到组件上,实现主要原理, 就是将需要绑定的props作为一个函数传过来, 在connect中传给mapStateToProps一个真实的store的数据

 9.说说react 中jsx语法糖的本质?

jsx本质就是下面这个函数React.createElement的语法糖,所有的jsx语法都会最终经过babel.js转化成为React.createElement这个函数的函数调用

10.说说你对redux中间件的理解?常用的中间件有哪些?实现原理?

 

Redux中,中间件就是放在就是在dispatch过程,在分发action进行拦截处理

前面我们了解到了Redux整个工作流程,当action发出之后,reducer立即算出state,整个过程是一个同步的操作

那么如果需要支持异步操作,或者支持错误处理、日志监控,这个过程就可以用上中间件,其本质上一个函数,对store.dispatch方法进行了改造,在发出 Action和执行 Reducer这两步之间,添加了其他功能

常用的redux中间件,如:redux-thunk:用于异步操作、edux-logger:用于日志记录

中间件都需要通过applyMiddlewares进行注册,作用是将所有的中间件组成一个数组,依次执行然后作为第二个参数传入到createStore中

11.说说AMD、CMD、commonJS模块化规范的区别?

CommonJS与AMD:

CommonJS规范加载模块是同步的,也就是说,只有加载完成,才能执行后面的操作。

AMD规范则是非同步加载模块,允许指定回调函数。

CMD和AMD:

1.对于依赖的模块AMD是提前执行,CMD是延迟执行。

2.AMD推崇依赖前置(在定义模块的时候就要声明其依赖的模块),CMD推崇依赖在用到某个模块的时候再去require——按需加载)。

 12.说说package.json中版本号的规则?

version 指定版本号

 >version 大于该版本号

>=version 大于等于该版本号

<version 小于该版本号

<=version 小于等于该版本号

~version 右侧任意

 ^version 从左向右,第一个非0号的右侧任意

x-version x位置任意

" "|| * version 表示版本任意

version1-version2 表示版本区间范围 包含首尾版本号

version1||version2||…version 表示或,或version1或version2,支持多个

13.说说React jsx转换成真实DOM的过程?

1.JSX在被编译后,会变成一个针对 React.createElement 的调用。
2.ceateElement的大致流程为:
3.二次处理key、ref、self、source四个属性值;
4.遍历config,筛选可以提到props中的属性;
5.将children中的子元素推入childArray数组;
6.格式化defaultProps
7.将以上数据作为入参,发起ReactElement的调用,最终由ReactElement返回虚拟Dom对象
8.最终将虚拟Dom传入ReactDom.render函数中,将其转变为真实Dom

 14.说说你对@reduxjs/toolkit的理解?和react-redux有什么区别?

@reduxjs/toolkit

@reduxjs/toolkit 是对 Redux 的二次封装,开箱即用可的一个高效的 Redux 开发工具集,使得创建store、更新store

15.React render方法的原理,在什么时候会触发?

原理

在类组件和函数组件中,render函数的形式是不同的。

类组件中render函数指的就是render方法;而在函数组件中,指的就是整个函数组件。

类组件调用 setState 修改状态

 函数组件通过useState hook修改状态

16.React性能优化的手段有哪些?

1、使用纯组件;
2、使用 React.memo 进行组件记忆(React.memo 是一个高阶组件),对 于相同的输入,不重复执行;
3、如果是类组件,使用 shouldComponentUpdate(这是在重新渲染组件之前触发的其中一个生命周期事件)生命周期事件,可以利用此事件来决定何时需要重新渲染组件;
4、路由懒加载;
5、使用 React Fragments 避免额外标记;
6、不要使用内联函数定义(如果我们使用内联函数,则每次调用“render”函数时都会创建一个新的函数实例);
7、避免在Willxxx系列的生命周期中进行异步请求,操作dom等;
8、如果是类组件,事件函数在Constructor中绑定bind改变this指向;
9、避免使用内联样式属性;
10、优化 React 中的条件渲染;
11、不要在 render 方法中导出数据;
12、列表渲染的时候加key;
13、在函数组件中使用useCallback和useMemo来进行组件优化,依赖没有变化的话,不重复执行;
14、类组件中使用immutable对象;

17.如何通过原生js实现一个节流函数和防抖函数? 

防抖函数(debounce)

功能:当事件被触发N秒之后再执行回调,如果在N秒内被触发,则重新计时。

节流函数(throttle)

功能:规定在一个单位时间内,只能触发一次函数。如果这个单位时间内触发多次函数,只有一次生效

 18.说说你对koa中洋葱模型的理解?

Koa是一个精简的node框架,被认为是第二代Node框架,其最大的特点就是独特的中间件流程控制,是一个典型的洋葱模型,它的核心工作包括下面两个方面:

将node原生的req和res封装成为一个context对象。

基于async/await的中间件洋葱模型机制。

19.说说如何借助webpack来优化前端性能?

  • JS代码压缩

  • CSS代码压缩

  • Html文件代码压缩

  • 文件大小压缩

  • 图片压缩

  • Tree Shaking

  • 代码分离

  • 内联 chunk

 20.说说你对webSocket的理解?

WebSocket是HTML5提供的一种浏览器与服务器进行全双工通讯的网络技术,属于应用层协议。它基于TCP传输协议,并复用HTTP的握手通道。浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接, 并进行双向数据传输。它最大的特点是:服务器可以向客户端主动推动消息,客户端也可以主动向服务器推送消息。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值