自己来回答前端面试题?

121 阅读8分钟

1、说一下闭包? 闭包是指有权访问另一个函数作用域中的变量的函数 内部函数引用外部函数的变量,再将数据return出去,这样在函数局部作用域内,变量被引用,不会被垃圾回收机制回收,就形成了一个封闭的存储空间,将变量存在了内存之中。 好处: 1、实现私有的变量和函数,由于闭包内部形成了对外部变量的引用关系,可以将某些变量和函数封装在闭包内部,实现私有性,避免全局污染。只要自己不暴露出去,外部是无法访问到的。 2、记忆状态,闭包可以记住函数定义时所处的环境,即使在函数调用之后,闭包仍然可以访问和操作定义时的变量,比如:单例模式的实现,利用闭包机制,让实例保持只有一个 3、延长了变量的生命周期,闭包使得外部的变量在函数执行结束后仍然存在于内存中。

坏处:1、因为变量得不到及时回收,可能会导致内存占用过高

2、说一下react渲染流程? 初始化阶段:React.createElement,生成虚拟dom对象,然后将vdom转换成fiber(这个过程叫reconcile协调),并会打上标记 更新(commit)阶段:增加、修改、删除元素

3、说一下react的diff与vue的diff? react: 1、通过唯一标识key比对 2、深度优先,同级比较

vue:?

4、webpack是如何实现热更新的? 通过watch监听文件的变化,发现有变化的文件,就重新编译该文件,通过websockt通知浏览器从而实现热更新。

5、你做过哪些前端优化?

6、react实现一个权限管理? 路由配置上增加权限属性来控制显示隐藏,提供一个公共高阶组件来判断权限,在需要用到的组件都加上高阶组件过滤,来控制显示隐藏。

7、说一下fiber? 是一个对象,以链表的形式来存储dom节点,通过return指向父级,child指向第一个子元素,sibling指向右边第一个元素,让整个vdom形成一个链表的结构。这样遍历的复杂度最多是o(n), 同时链表易于修改和删除元素。借鉴了requestIdelcallback的实现,利用浏览器空闲时间来执行优先级不同的任务,同时react将各种事件划分为不同的优先级。

8、作用域与作用域链 变量或者函数的可访问范围 全局作用域,函数作用域,let const会在{}内形成块级作用域。作用域链是指变量或者函数,会一直向上寻找定义的地方,一直找到全局。这个过程形成了一个链,叫作用域链。

9、原型与原型链 每个class都有原型,每个实例通过_proto_指向父级的原型prototype,这样对象的属性和方法的调用就会形成一个链,最终都指向Object

10、防抖跟节流 防抖就是一个事件过多久执行一次,多次触发事件,事件处理函数就会新的替换掉旧的重新开始计时,如果事件一直触发,就会一直新的替换旧的,会陷入卡死的状态,然后隔多久执行,常用于input框的输入自动搜索。节流是事件每隔多久执行一次,在这个过程,事件只会触发一次,常用于下拉滚动。

11、对设计模式有了解吗? 软件开发中为了实现高内聚低耦合,总结出了solid五大核心原则:单一功能原则,开放封闭原则,里式替换原则,接口隔离原则,依赖反转。依据这些原则,产生了设计模式,设计模式就是前人总结的一些好的模板跟经验。然后在实际开发中根据情况灵活去选择应用。常用的设计模式:工厂模式,原型模式,单例模式,装饰器模式,适配器模式,策略模式,状态模式,代理模式,观察者模式(订阅——发布模式)等。

12、说一下react的生命周期? 常用的有componentDidMount组件挂载之后,一般在这调用接口或者做一些初始化的数据操作,shoudcomponentupdate根据props或者state的变动来手动渲染组件,也是优化组件渲染的一种常用方式,componentdidupdate组件更新渲染更新完之后执行,componentwillunmount组件卸载之前,常用于清除定时器,监听器,状态等。

13、react源码读过吗?说一下? 看过一些,

14、三次握手四次挥手有了解过吗? 三次握手是指客户端在与服务器端建立连接前的确认,第一次握手就是client端发送链接请求,并带上syn序列号,第二次服务器收到请求,并且确认了序列号syn+1,再发送一个带ack序列号的确认链接的请求,第三次client端收到服务器的确认请求,然后再发送我已经收到,并确认的信息给服务器。这时双方就建立连接成功了,客户端可以开始传输数据了。 四次挥手是客户端与服务器断开连接请求的过程,第一次挥手,是客服端向服务端发送断开连接的请求,并且带上fin完成标示,第二次挥手是服务器收到客服端请求以后,确认标示,确认收到并同意请求。第三次是服务器向客户端发送fin标示,数据传输完毕,请求断开连接。第四次客服端收到服务器的断开连接请求,确认以后,发送已经收到并确认断开连接。服务器在收到确认请求后会自动断开连接。客户端在一段时间后也会自动断开连接。

15、react类组件和函数组件的区别? 类组件需要继承component,函数组件不需要。 函数组件没有了this,没有了render方法,不用再担心this指向了, 函数组件没有了生命周期,useEffect控制执行时机,便捷多了。 class组件适合复杂的组件处理,如果一个组件内部状态很多,组件复杂,class组件出来起来可能会更加得心应手。

16、hook的副作用?

17、websocket有了解吗?

18、前端工程化做过什么贡献?

19、做过什么封装?通用组件有哪些?

20、说一下js事件流? 分为事件捕获,目标阶段,事件冒泡。先从DOM树顶层开始进行事件捕获,直到事件触发到达了事件源元素,也就是目标元素,事件冒泡是指,该事件会随着DOM树的层级路径,由子节点向父节点进行层层传递,直至到达document。

21、对react diff算法的理解 react将vdom转换成了fiber,diff算法的比对也就为了更快捷的生成新的fiber,目的就是复用.

22、受控组件非受控组件的区别 在 HTML 中,表单元素如 <input><textarea> 和 <select> 表单元素通常保持自己的状态,并根据用户输入进行更新。而在 React 中,可变状态一般保存在组件的 state(状态) 属性中,并且只能通过 setState()更新。 由 React 控制的输入表单元素称为“受控组件”。那么相反的,值并不由 React 进行控制,该组件自己输入,减少等等,该元素成为非受控组件。

23、说一下webpack的流程 初始化参数。获取用户在webpack.config.js文件配置的参数

开始编译。初始化compiler对象,注册所有的插件plugins,插件开始监听webpack构建过程的生命周期事件,不同环节会有相应的处理,然后开始执行编译。

确定入口。根据webpack.config.js文件的entry入口,开始解析文件构建ast语法树,找出依赖,递归下去。

编译模块。递归过程中,根据文件类型和loader配置,调用相应的loader对不同的文件做转换处理,在找出该模块依赖的模块,递归本操作,直到项目中依赖的所有模块都经过了本操作的编译处理。

完成编译并输出。递归结束,得到每个文件结果,包含转换后的模块以及他们之前的依赖关系,根据entry以及output等配置生成代码块chunk

打包完成。根据output输出所有的chunk到相应的文件目录

24、css画一根0.5px的线 transform:scaleY(0.5);border:1px solid #000;

25、BFC有了解吗 BFC(Block formatting context)直译为"块级格式化上下文"。 满足下列条件之一就可触发BFC

  【1】根元素,即HTML元素

  【2】float的值不为none

  【3】overflow的值不为visible

  【4】display的值为inline-block、table-cell、table-caption

  【5】position的值为absolute或fixed

BFC是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面元素,反之亦然。它与普通的块框类似,但不同之处在于:

  【1】可以阻止元素被浮动元素覆盖

作用:

  1. 自适应两栏布局
  2. 可以阻止元素被浮动元素覆盖
  3. 可以包含浮动元素——清除内部浮动
  4. 分属于不同的BFC时可以阻止margin重叠

26、元素水平垂直居中 第一种:flex布局 display: flex; justify-content: center; align-items: center; 第二:父级:position:relative 子:position: absolute,top:50%,transform:translate(-50%,-50%) 第三:父级 display: table-cell;vertical-align: middle; 子:margin: 0 auto;记得给宽度