关于React及其他js基础

1.React的事件是合成事件,采用事件委托机制将所有事件绑定在了document上,因此要阻止事件,需要通过e.preventDault(),而不是原来的通过return false;e.stopPropagation()用来阻止事件捕获。

2.事件绑定,非箭头函数为何需要声明绑定this?因为在js中,class声明的类中的方法定义在prototype上,并不是定义在this上,因此在使用this.xxx来调用时,this由于未指定故未undefined

3.setState可能会是异步的,因为在执行setState时先判断当前是否在pending中,如果在setTimeout或者addEventListener中直接执行setState,则不会有这个判断,因此会是同步的

4.tree-shaking是怎么剔除无用的代码的?webpack、rollup等编译工具利用uglify识别代码中的dead code(主要有三种:不可到达的、代码执行的结果无用、代码只影响死变量),从而将对应的部分剔除。

5.为何tree-shaking在ES6才流行起来?因为其消除原理依赖于ES6的模块特性,由于ES6 module只能作为模块顶层的语句出现,其名称只能是字符串常量,而且其binding是immutable(不可改变的),从而项目的依赖关系是确定的,与运行时状态无关,可以进行可靠的静态分析,确定依赖图,进行消除!

6.静态分析就是不执行代码,从字面量上对代码进行分析,关于commonJS和ES module之间的区别,请看文章

7.浏览器运行机制,js是单线程的,但是浏览器是多线程的,包括GUI线程(生成DOM、CSS树等),js主线程,事件线程及异步http请求线程等,注意前两个线程是互斥的。

8.js引擎的工作原理:解析js文件,并等待任务队列中任务的到来,此处的处理机制为eventloop,任务又可分为宏任务和微任务,请结合内存结构来理解不同任务的处理机制。请深刻理解任务在内存中的流转过程。

9.js引擎对js文件的解析是先将代码转化成抽象语法树AST(JSON),再将AST转化为字节码,提供给计算机

10.当组件层级较深时,传递props将会非常麻烦而且容易出错,可以使用组件组合的方式,在高层组件中,将组件自身作为属性直接传递下去。

11.使用context有三种方式:provider与consumer方式、className.contextType方式和static contextType方式

12.浏览器请求缓存判断机制:


关于React及其他js基础_第1张图片
http请求缓存

总体步骤如下:

·通过Expries或者Cache-Control来判断是否有在缓存中,如果在缓存中,则取缓存,200from cache

·如果超出缓存时间,有ETag,比较ETag,向后端发送带ETag的请求,判断请求内容是否更新,如果更新则200,并更新缓存,如果未更新,则304,如果无ETage,则比较Last-Modified,同上

·如果无Last-Modified,则直接向后端请求

13.webpack HRM原理:https://segmentfault.com/a/1190000019126657,webpack监听文件的改动,并重新编译打包后输出到静态文件里,同时,webpack服务器和浏览器之间有websocket长连接,将各个阶段的状态信息(主要是hash)发送给浏览器,浏览器从而进行不同的处理,当hash变化时,HRM中枢获得该hash并发送ajax请求,获得最新的模块

14.react性能优化:主要点:防止重复渲染和防止使用内联对象

15.webpack流程图:


webpack流程图


16.useReducer支持异步dispatch解决方案:异步使用promise,重写dispatch方法,或者问题可以改为:使用hook模拟实现redux,并支持异步

17.redux的subscribe()监听方法有什么作用?答案。在每次dispatch(action)更改state之后,subscribe会监听到state的变化并分发下去,推进后续流程。即subscribe监听全局state的变化,并调用getState(),进而判断组件是否需要更新,使数据与页面联系起来。

18.js的splice方法,返回删除的元素并改变数组,注意第二个之后的参数表示从删除位置开始添加的元素。通过该方法可以实现数组的插入、删除及替换

[1,2,3,4,5].splice(3, 1, "a", "b");  ==> [1,2,3,"a", "b", 5]

19. Webpack处理css文件需要引入的loader:

https://blog.csdn.net/zuiziyoudexiao/article/details/72934603·sass: style-loader, css-loader, sass-loader

·less: style-loader, css-loader, less-loader

·css: style-loader, css-loader

注意顺序:loader执行从右往左,sass-loader和less-loader将.sass和.less文件转换为.css文件,css-loader解析.css文件,style-loader将.css文件插入到文档中。

20. Js取随机数:Math.floor(Math.random()*(max-min) + min)取 min(包含)~max(不包含)之间的随机整数,Math.random()表示0~1(不包含)之间的随机数。Math.floor()取下整,Math.ceil()取上整,Math.round()四舍五入。

21. 继承

22.Promise的优缺点:无法取消;如果没有then,内部error不会被外部捕获;如果处于pending状态,无法知道当前确切进展(是刚开始还是快结束)

23.堆内存和栈内存的区别:栈:存放基本类型,堆:存放引用类型

24.js垃圾回收:标记清除和引用计数。

25.react-router的history机制,动态加载机制,保持一个路径数组,并使用一个变量保持当前引用索引,使用push方法跳转新路径,使用replace来替代当前路径,使用listen观察者模式来通知页面的变化。

26.node不是一门语言,是一套js的运行时,运行环境,没有DOM和BOM,添加了一些新模块,若http,fs等。相对于java,特点有

1.事件系统采用异步,可以更好的处理并发请求。

2.单线程不适合处理密集CPU操作,如逻辑处理,加解密等,会阻塞单线程。

3.可以更快链接数据库,java需要建立多线程并添加控制,node只需要回调。

27.cookie的过期时间Expiration,有时会看到该值为当前时间或者过去的一个时间,此情况并不代表该cookie已过期,而是说该cookie是一个临时性cookie,该cookie的有效期是当前session,当页面关闭时,改cookie消失。

28.koa执行流程图:

关于React及其他js基础_第2张图片
koa执行流程图

httpServer接受一个fn,该fn接受参数req和res

httpServer(function(req, res){
    doSomething();
});

29.koa的洋葱模型由koa-compose中间件实现,具体解析如下:koa-compose

洋葱模型实现后进先出的关键代码:

dispatch(i) {

    ...

    return Promise.resolve(fn(ctx, dispatch.bind(null, i+1)));

    ...

}

退出条件:

if(i == middlewares.length) fn = next;

if(!fn) return Promise.resolve();

你可能感兴趣的:(关于React及其他js基础)