问题1 介绍一下React
React是一个UI框架。它创造了虚拟DOM并将他们存储起来。每当状态发生变化的时候就会创建新的虚拟节点和之前的进行对比,让变化的部分进行渲染,整个过程没有对DOM进行获取和操作。只有一个渲染的过程 ,所以React是一个UI框架;
问题2 介绍一下Redux
Redux其实就是一个状态管理的容器。主要分为三部分,
action
,reducer
,Store
;
action
用来操作state到store.是store的唯一来源。以对象的形式存在;
reducer
是action的处理器,主要处理传入的action和旧的state。按指定的逻辑返回新的state;
store
就是把这几样东西连接到一起。维持应用的state;提供dispatch({})方法更新state;提供getState()方法获取state,通过subscribe()注册监听器
说一下钩子函数
10个钩子函数:
getDefaultProps()
:设置默认属性。getInitialState()
设置初始状态,一般不用;componentWillMount()
组件初始时调用。挂载前。只调用一次。render()
创建虚拟DOM,进行DIFF算法。更新DOM树。componentWillReceiveProps(nextProps)
组件初始状态时不调用。组件接受新的props时调用。shouldComponentUpdate(nextProps,nextState)
react性能优化的一环。componentWillUpdata(nextProps,nextState)
将要更新时。render()
重新渲染页面。componentDidUpdate()
更新完成后。componentWillUnmount()
组件将要卸载时;
JS回收机制有哪几种方法?
(1)标记清除法
(2)引用计数法
说一下性能优化
减少Http请求。资源合并压缩。图片压缩等。减少DOM操作。
说一下闭包
什么叫闭包?闭包就是当一个函数被父函数之外的一个变量引用时就会形成闭包。一般当一个函数执行完成后。其作用域就会销毁。如果是闭包的话就不会被销毁。闭包的作用就是包含私有变量不被外界污染、通过接口的方式来获取变量。但是外界不能直接获取该变量;
说一下原型链, Function类和Object类是什么关系?
在JS中万物皆对象。每个对象都有一个__proto__属性。该属性指向它的原型。当一个对象在查找一个属性是。如果自身没有。就会通过__proto__往它的原型查找。直到找到Object.prototype.__proto__为null。这样就形成了原型链;
Function.proto==Object.proto //true Function是Object的实例。同样Object又是Function的实例、
说一下JS中的单线程和多线程
首先要知道JS是单线程。单线程就是上一个任务执行完成以后,才会执行下一个任务。上一个任务如果没有执行完,下一个任务就处于等待状态;
那么JS在最初设计的时候就设计成单线程。因为,假设JS是多线程的。那么第一个线程是删除DOM,第二个线程是编辑DOM 那么JS先执行那个呢?所以JS设计成单线程是有一定的原因的。还有一点JS就是用来操作DOM的;
说到这里。如果上一行解析时间太长。那么下面的代码就会被阻塞。对于用户而言。阻塞就意味这卡死,这样就导致了很差的用户体验;那么这时候。JS中的异步事件函数就出现了。JS是单线程的,只有一条线程。那么是如何实现异步的呢?是通过事件循环(Event Loop);
console.log(1)
setTimeOut(function(){
console.log(2)
},0)
console.log(3)
//1 3 2
也就是说setTimeOut里的函数没有立即执行,而是延迟了一段时间,满足一定条件之后才去执行,这类代码就叫异步代码
所以JS里分为同步和异步两种方式
- 首先判断JS是同步还是异步。同步就进入主线程,异步呢就进入事件列表中;
- 异步任务在事件列表中注册函数,当满足一定条件后,被推入事件队列中
- 同步任务进入主线程后一直执行,直到主线程空闲时,才会去事件队列中查看是否有可执行的异步任务,如果有就推入主线程。这就是事件循环;
再深刻一点就是:
异步事件又分为宏任务和微任务、宏任务好比setTimeOut,setInterval…,微任务。比如new Promise.process…,
那么当执行到异步任务时候。会执行宏任务并把微任务放入事件队列中。等宏任务执行完成以后。再把事件队列里的微任务全部执行;严谨的来说应该是这样的;