关于面试中被问到的难点
1.TCP的拥塞控制(调度算法)
TCP拥塞控制的目标是最大化利用网络上瓶颈链路的带宽。拥塞窗口的大小取决于网络的拥塞程度,并且在动态的变化,只要网络中没有出现拥塞,拥塞窗口的值就可以再增大一些,以便把更多的数据包发送出去,但只要网路出现拥塞,拥塞窗口的值就应该减小一些,以减少注入到网络中的数据包数。常见的拥塞控制算法reno将拥塞控制的过程分为四个阶段:慢启动、拥塞避免、快重传和快恢复。慢启动阶段的思路就是不要一开始就发送大量的数据,先探测一下网络的拥塞程度,也就是说由小到大逐渐增加拥塞窗口的大小,在没有丢包时每收到一个ACK就将拥塞窗口大小加1(单位是MSS,最大单个报文段长度),每轮次发送窗口增加一倍,呈指数增长,若出现丢包,则将拥塞窗口减半,进入拥塞避免阶段。当窗口达到慢启动阈值或出现丢包时,进入拥塞避免阶段,窗口每轮次加一,呈线性增长;当收到对一个报文重复的ACK时,认为这个报文的下一个报文丢失了,进入快重传阶段,要求接收方在收到一个失序的报文段后就立即发出重复确认(为的是使发送方及早知道有报文段没有送达对方,可提高网络的吞吐量约20%)而不要等到自己发送数据时捎带确认。快重传完成后进入快速恢复阶段,将慢启动阈值修改为当前当前拥塞窗口值的一半,同时拥塞窗口值等于慢启动阈值,然后进入拥塞避免阶段。
2.computed与watch的区别:
(1)watch是监听器,可以监听某一个数据,然后执行相应的操作。(2)不支持缓存,数据改变会直接触发相应的操作(3)监听的函数会接收两个参数,第一个参数是最新的值,第二个参数是输入之前的值。(4)支持异步操作。
(1)computed是计算属性,也就是依赖某个值或者props通过计算得来的数据。(2)computed的值是在getter执行之后进行缓存,只有在它依赖的数据发生变化时,才会重新调用getter来计算。(3)computed内有异步操作时无效,无法监听数据的变化。
通俗的来讲:当多个数据影响一个数据的时候,需要通过复杂计算得出结果,建议用computed,但是当一个值发生变化引起一系列操作的时候,比如一个数据需要被监听并且对数据做一些操作的时候,这种情况就比较适合用watch。
3.history路由和hash路由的区别:
(1)新老节点均有子节点,则对子节点进行diff操作,调用updateChildren,这个updateChildren也是diff的核心。
(2)如果老节点没有子节点而新节点存在子节点,先清空老节点DOM的文本内容,然后为当前DOM节点加入子节点。
(3)当新节点没有子节点而老节点有子节点的时候,则移除该DOM节点的所有子节点。
(4)当新老节点都无子节点的时候,就只是简单的文本替换。
5.vue组件通信的方式和插槽:

TCP拥塞控制的目标是最大化利用网络上瓶颈链路的带宽。拥塞窗口的大小取决于网络的拥塞程度,并且在动态的变化,只要网络中没有出现拥塞,拥塞窗口的值就可以再增大一些,以便把更多的数据包发送出去,但只要网路出现拥塞,拥塞窗口的值就应该减小一些,以减少注入到网络中的数据包数。常见的拥塞控制算法reno将拥塞控制的过程分为四个阶段:慢启动、拥塞避免、快重传和快恢复。慢启动阶段的思路就是不要一开始就发送大量的数据,先探测一下网络的拥塞程度,也就是说由小到大逐渐增加拥塞窗口的大小,在没有丢包时每收到一个ACK就将拥塞窗口大小加1(单位是MSS,最大单个报文段长度),每轮次发送窗口增加一倍,呈指数增长,若出现丢包,则将拥塞窗口减半,进入拥塞避免阶段。当窗口达到慢启动阈值或出现丢包时,进入拥塞避免阶段,窗口每轮次加一,呈线性增长;当收到对一个报文重复的ACK时,认为这个报文的下一个报文丢失了,进入快重传阶段,要求接收方在收到一个失序的报文段后就立即发出重复确认(为的是使发送方及早知道有报文段没有送达对方,可提高网络的吞吐量约20%)而不要等到自己发送数据时捎带确认。快重传完成后进入快速恢复阶段,将慢启动阈值修改为当前当前拥塞窗口值的一半,同时拥塞窗口值等于慢启动阈值,然后进入拥塞避免阶段。
2.computed与watch的区别:
(1)watch是监听器,可以监听某一个数据,然后执行相应的操作。(2)不支持缓存,数据改变会直接触发相应的操作(3)监听的函数会接收两个参数,第一个参数是最新的值,第二个参数是输入之前的值。(4)支持异步操作。
(1)computed是计算属性,也就是依赖某个值或者props通过计算得来的数据。(2)computed的值是在getter执行之后进行缓存,只有在它依赖的数据发生变化时,才会重新调用getter来计算。(3)computed内有异步操作时无效,无法监听数据的变化。
通俗的来讲:当多个数据影响一个数据的时候,需要通过复杂计算得出结果,建议用computed,但是当一个值发生变化引起一系列操作的时候,比如一个数据需要被监听并且对数据做一些操作的时候,这种情况就比较适合用watch。
3.history路由和hash路由的区别:
hash 路由:监听 url 中 hash 的变化,然后渲染不同的内容,这种路由不向服务器发送请求,不需要服务端的支持;history 路由:监听 url 中的路径变化,需要客户端和服务端共同的支持;
当页面中的 hash 发生变化时,会触发hashchange事件,因此我们可以监听这个事件,来判断路由是否发生了变化,hash路由永远不会提交到服务端。而history模式如果服务端没有新更新的 url 时,一刷新浏览器就会报错,因为刷新浏览器后,是真实地向服务器发送了一个 http 的网页请求。因此若要使用 history 路由,需要服务端的支持。
4.详细说一下diff算法:diff算法是一种优化手段,通过进行虚拟节点元素的对比,并返回一个patchs对象,用来存储两个节点不同的地方,最后用patchs记录的消息去局部更新DOM.(1)新老节点均有子节点,则对子节点进行diff操作,调用updateChildren,这个updateChildren也是diff的核心。
(2)如果老节点没有子节点而新节点存在子节点,先清空老节点DOM的文本内容,然后为当前DOM节点加入子节点。
(3)当新节点没有子节点而老节点有子节点的时候,则移除该DOM节点的所有子节点。
(4)当新老节点都无子节点的时候,就只是简单的文本替换。
5.vue组件通信的方式和插槽:
父向子传值和子向父传值:父组件 A 通过 props 的方式向子组件 B 传递,B to A 通过在 B 组件中 $emit, A 组件中 v-on 的方式实现。
插槽:在vue的开发当中,我们可能也经常会使用插槽slot,父组件给子组件传递DOM元素。插槽的实质,实际上是对于子组件的扩展,通过slot插槽向组件内部指定位置传递内容,也是承载内容分发的出口。默认插槽相当于是在子组件中写明插槽的内容,当父组件在使用子组件的时候,同时父组件没有指定插槽的内容时,那么就使用子组件定义的默认插槽的内容。具名插槽相当于是在子组件的插槽中给slot添加name属性,进行命名,在父组件需要使用到插槽的地方,给slot添加之前的命名。这样,可以实现向多个组件内部指定位置传递指定的内容。作用域插槽相当于是子组件的DOM结构由外部传递过来,而使用作用域插槽,子组件可以向父组件传递数据,父组件以template模版,通过 slot-scope="props" 进行接收数据,props.item就是传递过来的数据。
6.vue路由传参的四种方式:
(1)通过router-link路由导航的方式:父组件: 使用<router-link to = "/跳转路径/传入的参数"></router-link>子组件: this.$route.params.num接收父组件传递过来的参数(路由配置::{path: '/a/:num', name: A, component: A})
(2)调用$router.push实现路由传参
(3)
(4)
vue的路由传参方式有params和query两种传参方式,query通过path切换路由,params通过name切换路由,query通过this.$route.query来接收参数,params通过this.$route.params来接收参数,params也可以通过path进行传参,但这需要对注册的路由进行相关配置。