- 谈谈你对TCP三次握手和四次挥手的理解
1. A发起请求,发送信息,seq=0
2. B接受到请求,B本次的seq=0,回应akc=1(A的seq+1,代表我收到你seq是0的消息了)
3. A收到回应,发送seq=1,ack=1(B的seq+1),连接建立好了
四次挥手
tcp是全双工的,就是A 正在给 B发信息的同时,B也在给A发信息,所以当断开的时候,必须要求双方都得知道
1. A向B发送断开连接的信息
2. B接收到关闭信息,回应A数据还没发送结束,等待发送结束
3. B向A发送发送结束结果,等待A回应B就关闭
4. A向B发送回应,B关闭
5. A等待2MSL(最大报文段生存时间)后,B没东西给过来,也关了
- React 中 setState 什么时候是同步的,什么时候是异步的?
这里所说的同步异步, 并不是真正的同步异步, 它还是同步执行的。这里的异步指的是多个state会合成到一起进行批量更新。
如果是由React引发的事件处理(比如通过onClick引发的事件处理),调用setState不会同步更新this.state,除此之外的setState调用会同步执行this.state。所谓“除此之外”,指的是绕过React通过addEventListener直接添加的事件处理函数,还有通过setTimeout/setInterval产生的异步调用。
原因
在React的setState函数实现中,会根据一个变量isBatchingUpdates判断是直接更新this.state还是放到队列中回头再说,而isBatchingUpdates默认是false,也就表示setState会同步更新this.state,但是,有一个函数batchedUpdates,这个函数会把isBatchingUpdates修改为true,而当React在调用事件处理函数之前就会调用这个batchedUpdates,造成的后果,就是由React控制的事件处理过程setState不会同步更新this.state。
- 以下 3 个判断数组的方法,请分别介绍它们之间的区别和优劣
Object.prototype.toString.call() 、 instanceof 以及 Array.isArray()
-
Object.prototype.toString.call() 可以看到toString方法是存在于Object内置对象,每一个‘继承’Object的对象都有这个方法。方法返回[object type]type是对象的类型。
这种方法对于所有基本的数据类型都能进行判断,即使是 null 和 undefined 。
const an = ['Hello','An']; an.toString(); // "Hello,An" Object.prototype.toString.call(an); // "[object Array]" Object.prototype.toString.call(null) // "[object Null]" Object.prototype.toString.call(undefined) // "[object Undefined]"Object.prototype.toString.call() 常用于判断浏览器内置对象
-
instanceof
instanceof 的内部机制是通过判断对象的原型链中是不是能找到类型的 prototype。
instanceof 只能用来判断对象类型,原始类型不可以。并且所有对象类型 instanceof Object 都是 true。
[] instanceof Array; // true [] instanceof Object; // true由此看来想要区分对象是否是数组,这种方法并不适用
-
Array.isArray()
Array.isArray()用来判断对象是否为数组
const newArr = [1, 2, 3] console.log(Object.prototype.toString.apply(newArr)) // [object Array] console.log(newArr instanceof Object) // true console.log(newArr instanceof Array) // true console.log(Array.isArray(newArr)) // true顺便说一下最近出的电影哪吒真的很好看,有兴趣的一定要去看一下,周末愉快!