前端面试题整理(一)

1、redux原理

store是管理全局状态的,视图可以获取到store的状态,视图产生用户操作后会调用actionCreator的方法来生成一个action,将其dispatch派发给store
store会将当前的状态和此次的action交给reducer处理,reducer处理后需要返回新的状态,此时store就能得知数据的变化,然后回通知视图获取最新的数据

2、深拷贝方法及缺点

(1)使用递归实现的方式

代码逻辑复杂,性能差

(2)使用JSON的stringify和parse

1.对象中的方法属性会丢失
2.对象中值为undefined的属性会丢失
3.对象中有正则表达式、Error对象,则序列化结果将只得到空对象
4.对象中有NaN、infinity、和-infinity,则序列化的结果会变成null

(3)使用jquery中的extend属性

1.需要引用jQuery库
2.无法拷贝 对象中值为undefined的属性

(4)lodash中深拷贝

是递归方法分装,需要引入一个lodsh包

3、伪元素和伪类的区别

伪元素 : :after :before : selection :first-line

伪类: :link :visited :hover :active…
前端面试题整理(一)
(来自网络资源)

4、为什么要在每一个React组件中引入react

简单的解释:因为打包工具是需要React.createElement这个方法把你写的jsx转化为虚拟DOM的

5、vue剩余三个不常用的生命周期钩子

组件**时:activated
未**时:deactivated
当捕获一个来自子孙组件的错误时被调用:errorCaptured

6、尾调用

尾调用(Tail Call)是函数式编程的一个重要概念,本身非常简单,一句话就能说清楚,就是指某个函数的最后一步是调用另一个函数。

  1. 在函数结束的时候,通过 return 调用函数。只能调用函数,不能在进行其他的处理,就像情况2一样还需要在进行处理的函数
  2. 函数结束不一定就是函数的最后一行,这个要区分好

ES6解释:

尾调用之所以与其他调用不同,就在于它的特殊的调用位置。

我们知道,函数调用会在内存形成一个“调用记录”,又称“调用帧”(call frame),保存调用位置和内部变量等信息。如果在函数A的内部调用函数B,那么在A的调用帧上方,还会形成一个B的调用帧。等到B运行结束,将结果返回到A,B的调用帧才会消失。如果函数B内部还调用函数C,那就还有一个C的调用帧,以此类推。所有的调用帧,就形成一个“调用栈”(call stack)。

尾调用由于是函数的最后一步操作,所以不需要保留外层函数的调用帧,因为调用位置、内部变量等信息都不会再用到了,只要直接用内层函数的调用帧,取代外层函数的调用帧就可以了

总结:就是减少页面的调用帧 . 避免 调用栈 溢出

尾递归:尾回调+ 递归的结合体
尾调用和尾递归,需要在严格模式下才能使用