2021React前端面试总结

参加面试对面试官问题总结

最近一直参加面试,故对面试题进行一些总结,希望能对大家有用。

React生命周期执行顺序

这个问题考察点:我们对React生命周期的理解,对我们平时在项目中出现bug分析问题的一种考察。

在这里插入图片描述
constructor --> componentWillMount —> render --> componentDidMount
update 过程:componentWillReceiveProps -->shouldComponentUpdate --> componentWillUpdate --> render --> componentDidUpdate
卸载过程:componentWillUnmout

当然componentWillReceiveProps 在React中被废弃 替代是:getDerivedStateFromProps。
getDerivedStateFromProps在无论是props发生变化还是state发生变化都会触发。
在这里插入图片描述
可以参考:https://www.jianshu.com/p/514fe21b9914

父子组件生命周期执行顺序

参考上面的执行顺序,会先进父组件的componentWillMount然后依次执行子组件生命周期函数到所有子组件的componentDidMount执行完成再执行父组件的render和componentDidMount。
多个子组件交替执行。

a==11 && a==22 && a==33在什么情况下为true

考察点:js == 双等语句的隐性转换。
可以参考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Equality

这里大概说一下解题思路:
当对象和一个数值进行比较时,对象的隐形转换的方式是通过toString()valueOf()来进行转换,并且是先valueOf()toString()的。了解这个之后实现方式就很简单了。
代码如下:

var a = {
	num: 0,
	toString: () => {
		this.num++
		return this.num * 11;
	}
}
变量提升,js预编译,作用域

考察点:如标题,这个考察基础能力,这三个考察点可以出无限的面试题,所以一定要研究明白,加分项满满的。很多前端面试题教学的都有讲这个的。
参考面试题:

a = 100;
console.log(a) //100
var a;
console.log(b) //undefind
var b;

这是一个很简单的变量提升的题。当然这些是在非严格模式下执行的结果。
js为什么会有变量提升的情况存在,是因为存在预编译。那么预编译会做什么呢。
1.会将所有的声明(包括函数声明,函数形参)提前并且函数声明的优先级高于变量的声明。这也是变量提升的原因
2.然后会给所有的变量的赋值为undefind.
所以上面的代码执行顺序:

var a = undefind;
a = 100;
console.log(a);
//var a; 这一步提前执行了就不会再执行了

关于预编译还有很多很多面试题网上可以搜到,解决这类题的话,只要不着急慢慢自己整理出来实际的执行顺序就好。不要急不要乱。
这个是一个讲预编译的博客可以看看:
https://segmentfault.com/a/1190000018001871
关于作用域的话,只要牢记就近原则这一条就ok
就近原则:会在变量使用的最小作用域单元查找(块级活着函数级)找不到往父级一直找到全局作用域为止。

var a = 100;
var b = 10;
function test(a) {
	console.log(a);
	console.log(b);
	console.log(c);
	var c = 1;
	console.log(c);
}
test(20);
// 20
// 10
// undefind
// 1

这是我自己造的一道面试题,这道题需要注意函数形参也相当于变量声明。
然后b这里就能看出作用域的查找原理。

HTTP协议和HTTPS协议区别以及网络状态码

关于http协议:https://developer.mozilla.org/zh-CN/docs/Web/HTTP

http协议状态码:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status

状态码的话:一般常问到的是300 和 400 和500这些错误的状态码
在这里插入图片描述
300一般是重定向的。
在这里插入图片描述
400的状态码一般是客户端的响应,是服务端对客户端发送过来的数据的一些响应,也是前端接触比较的状态码回答的时候拿项目中比较常见的来说,如果问太多的话 可以回答忘记了,因为有的时候在实际开发中我们也经常会去查阅状态码。

500 是服务端的响应,表示客户端的请求已经发给服务端,但是在服务端出现了问题。

在这里插入图片描述
其实对于网络状态码面试提问,面试官是很宽容的,所以答的好是加分项,即使答的不好,面试官也不会很纠结这个。

还有遇到这个问题的时候,也可以通过一些自己在项目中常遇见的状态码,然后自己怎么通过状态码分析前端请求方法错误地方来作答,这样也行。

http和https协议的区别:

1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。

2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。

3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
  可以在网上搜索一些博客看看。

Hook的好处为什么Hook会大规模推崇

React的hooks出来也一年多,至于他的好处各大博客也有讲,可以自己搜索一些博客,加上自己平时使用hooks的过程的感受来谈谈,总结一套适合自己的答案。

可以参考React官网中对于Hook简介

常用的Hook有哪些

对于这个问题更多是你在平时工作中怎么使用hook然后对每个hook怎么理解他们的用途来答。
首先React官网中Hook概览这个页面里面的hook一定有的也是一定要答。
其次就是其他hook
这里面需要额外说几句的

  1. useCallback: 这个我们在平时项目中会使用该hook包裹一些方法,缓存这个方法,当依赖发生变化时更改方法体的实现然后为了解决闭包陷阱。
  2. useMemo:React 可能仍需要在跳过渲染前渲染该组件。不过由于 React 不会对组件树的“深层”节点进行不必要的渲染,所以大可不必担心。如果你在渲染期间执行了高开销的计算,则可以使用 useMemo 来进行优化。这个是React官网上的一段话,可以去理解一下。大部分做性能优化。
  3. 提到useMemo需要注意的它有点类似shouldComponentUpdate,在使用hook之后都是函数组件,那么除了这个React还提供了React.memo这样的高阶组件来实现类似shouldComponentUpdate功能。
  4. 关于useCallback和useMemo的差异,其实useCallback的底层是通过useMemo来实现的,所以可以通过自己在实际项目中对他们不同的使用场景来答,然后既然useCallback的底层是useMemo实现的也就表示useMemo可以完全替代useCallback。
Promise

这个是前端必会的,就不过多口舌。
文档:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise

首先它有三个状态,pending 已兑现(fulfilled)成功,已拒绝(rejected)cath,一旦状态发生变化就不逆了

然后就是promise.all https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise/all
此方法在集合多个 promise 的返回结果时很有用。

完成(Fulfillment):
如果传入的可迭代对象为空,Promise.all 会同步地返回一个已完成(resolved)状态的promise。
如果所有传入的 promise 都变为完成状态,或者传入的可迭代对象内没有 promise,Promise.all 返回的 promise 异步地变为完成。
在任何情况下,Promise.all 返回的 promise 的完成状态的结果都是一个数组,它包含所有的传入迭代参数对象的值(也包括非 promise 值)。

失败/拒绝(Rejection):
如果传入的 promise 中有一个失败(rejected),Promise.all 异步地将失败的那个结果给失败状态的回调函数,而不管其它 promise 是否完成。

有些面试官会让人自己实现一个promise.all的方法,这个就看你怼promise.all这个方法的理解了,可以根据上面的描述自己自己说说思路。
可以自己查查博客,因为我也是自己知道大概思路,直接写代码没写过,后面有空我会尝试一下。

Promise.race() https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise/race

一个待定的 Promise 只要给定的迭代中的一个promise解决或拒绝,就采用第一个promise的值作为它的值,从而异步地解析或拒绝(一旦堆栈为空)。

描述
race 函数返回一个 Promise,它将与第一个传递的 promise 相同的完成方式被完成。它可以是完成( resolves),也可以是失败(rejects),这要取决于第一个完成的方式是两个中的哪个。

如果传的迭代是空的,则返回的 promise 将永远等待。

如果迭代包含一个或多个非承诺值和/或已解决/拒绝的承诺,则 Promise.race 将解析为迭代中找到的第一个值。

最近面试遇到的问题基本在这里,因为我面试的公司没有那种一线大厂,可能有些面试题就很常见,但是也希望对大家有一些帮助。

面试总结:每一道面试题都有面试官的考察点,即使这个考察点在实际开发中用的不多但是依然是有用。而我们作为面试者,所要做的只有努力提升自己,我以前很不喜欢刷面试题,但是这次面试真的改变很多,刷一些面试题能自己明白很多,在面试的时候更加从容,这样不是很好嘛。但是刷面试题最好能理解地去记忆。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神经佳丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值