JS-每周3道面试题(第7周)

132 阅读3分钟
  1. 谈谈你对TCP三次握手和四次挥手的理解

图中A为客户端,B为服务端 三次握手

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没东西给过来,也关了
  1. 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。

  1. 以下 3 个判断数组的方法,请分别介绍它们之间的区别和优劣
Object.prototype.toString.call() 、 instanceof 以及 Array.isArray()
  1. 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() 常用于判断浏览器内置对象

  2. instanceof

    instanceof 的内部机制是通过判断对象的原型链中是不是能找到类型的 prototype。

    instanceof 只能用来判断对象类型,原始类型不可以。并且所有对象类型 instanceof Object 都是 true。

    []  instanceof Array; // true
    []  instanceof Object; // true
    

    由此看来想要区分对象是否是数组,这种方法并不适用

  3. 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
    

    顺便说一下最近出的电影哪吒真的很好看,有兴趣的一定要去看一下,周末愉快!