首页 > 其他分享 >商汤科技面试

商汤科技面试

时间:2022-12-20 13:44:44浏览次数:45  
标签:缓存 科技 队列 cache 面试 任务 商汤 组件 执行

1.cpu缓存

  用于减少处理器访问内存所需平均时间的部件。其容量远小于内存,但速度却可以接近处理器的频率。

  当处理器发出内存访问请求时,会先查看缓存内是否有请求数据。如果存在,则不经访问内存直接返回该数据;如果不存在,则要先把内存中的相应数据载入缓存,再将其返回处理器。

2.浏览器缓存

  (原因)浏览器缓存类似cpu缓存,用于加速浏览,浏览器再用户磁盘上对请求过的页面进行存储,当访问者再次请求这个页面时,浏览器就可以从本地磁盘显示页面

  (读写顺序)1.调用service worker的fetch事件获取资源;查看memory cache;查看disk cache;如果强制缓存未失效,则使用强制缓存;如果失效,使用协商缓存,比较后确定304还是200

  (缓存位置)service worker memory cache disk cache  

    service worker 是一个注册再指定源和路径下的事件驱动worker;特点是:运行在worker上下文,不能访问dom,独立与主线程之外,不会造成阻塞,设计完全异步,同步api不能在service worker中使用

    memory cache 是浏览器内存中的缓存,相比disk cache它的特点是读取速度快,但容量小,一旦tab页关闭,memory cache就将清空。

    disk cache是存在硬盘中的缓存,根据http头部的各类字段进行判定资源的缓存规则,相比memory cache的disk cache拥有存储空间时间长等优点,网站中的绝大多数资源都是存在disk cache 中的。

3.JavaScript事件循环

  js在执行时,有以下几个主要部分参与了事件循环。

  1.执行栈,用来创建执行环境,执行js代码  2.异步处理模块,用来处理异步事件 3.任务队列,包括宏任务队列和微任务队列

  事件循环的过程为,当执行栈为空的时候,就会从任务队列中,取任务来执行,共分三步:

  1.取一个宏任务来执行,执行完毕后,下一步。2.取一个微任务来执行,执行完毕,再取一个微任务来执行。直到微任务队列为空,执行下一步。

    为什么有宏任务和微任务之分?个人理解,宏任务才是真正意义上的任务,而微任务相当于宏任务的附属的一系列操作和响应。所以,js引擎每次取出一个宏任务执行,并且执行相关的微任务,这样保证一个完整的任务被执行完。这就是微任务队列只有一个的原因,微任务队列就是用来辅助宏任务队列的任务的完整执行的。宏任务队列才是真正意义的任务,任务有优先级之分就很好理解了,因此才有多个宏任务队列,为了区分优先级。

4.react的fiber架构

  什么是fiber架构? React使用的算法将一棵树与另一棵树进行比较,以确定哪些部分需要更改。

  解决了什么问题? 组件不能返回数组,常见的场合时ul元素下只能使用li,tr元素下只能使用td或th,这时这里有一个组件循环生成li或td列表时,我们并不想再放一个div

  弹窗问题,之前一直使用不稳定的unstable_renderSubtreeIntoContaine。弹窗是依赖原来DOM树的上下文,因此这个api第一个参数是组件实例,通过它得到对应虚拟DOM,然后一级级往上找,得到上下文。

  异常处理,我们想知道哪个组件出错,虽然有React DevTool,但是太深的组件树查找起来还是很吃力,希望有个方法告诉我出错位置,并且出错时,能让我有机会进行修改工作。

  React16将内部组件层改成FIber这个数据结构,Fiber节点拥有return,child,sibling三个属性,分别对应父节点,第一个孩子,它右边的兄弟,有了它们就足够将一棵树变成一个链表。

5.reacthook

  hook给函数式组件增加状态和逻辑,并将功能代码聚合在一起   hook给函数式组件添加状态和逻辑,并将功能代码聚合在一起   不要在循环,条件或嵌套函数中调用hook,确保总是在你的react函数的最顶层以及任何return之前调用它们。   因为这样确保hook在每一次渲染中都按照同样的顺序被调用,这让react能够在多次的usestate和useeffect调用之间保持hook状态的正确   每一个useState都会在当前组件中创建一个hook对象,并且这个对象中next属性始终指向下一个useState的hook对象,这些对象以一种类似链表的形式存在Fiber.memorizedState中,   而函数组件就是通过fiber这个数据结构来实现每次render后不会被useState重新初始化 6.有状态组件和无状态组件

有状态组件就是一个类,无状态组件是一个函数;
区别:
1.(是否拥有state)有状态组件可以使用状态:state,无状态组件不能使用state;只有继承component这个组件它才能拥有state进行一些数据的存储和管理,仍然可以拥有props;
2.(生命周期)如果是有状态组件的话那么你就会拥有生命周期函数,无状态组件就不用有生命周期函数,因为数据的更改都是通过状态进行更改。使用props进行组件间的通信进行传值,如果要更改某一些数据的话使用的是state,既然数据可以发生变化那么它就会触发对应的生命周期函数;

7.webpack plugin

plugin(插件)是webpack的支柱功能,webpack整体的程序架构也是基于插件系统之上搭建的,plugin的目的在于解决loader无法实现的其他功能.

plugin是webpack插件系统,目的解决loader无法实现的其他功能

8.gitreset 

回退到之前版本  变成没有add状态

 

  Less translate VIP 已过期, 请续费后继续使用

标签:缓存,科技,队列,cache,面试,任务,商汤,组件,执行
From: https://www.cnblogs.com/baller-coder/p/16993997.html

相关文章