1-Momenta
react通信
- 父组件向子组件传递props,callback
- 子组件通过event向父组件发送消息
- context
- 兄弟:将state提升到父组件
- Global Variables(localStorage)
- 完全不相关:observer pattern
vs. Vue
- provide / inject
react diff算法
算法
eventloop
同步 call stack
异步 callback queues
当call stack为空时,
一个tick
- deque and run the oldest task from macrotask queue (dom event, ajax, setTimeOut, setInterval)
- execute all microtasks (Promises aync/await)
- render changes if any
- wait if macrotask queue is empty
编译原理
闲聊etc.
2-ByteDance
项目
SSR渲染
rendering web pages on the server and sending fully rendered HTML pages to the client for display
csr: web pages are constructed in the browser using javascript
benefit:
- seo: search engine optimization
- performance
eventloop
var let const
arrow function 和 普通函数的区别
- 不能Generator函数,不能使用yeild关键字。
- 箭头函数不具有prototype
- 箭头函数不具有super
- 箭头函数不具有new.target,不能作为构造函数使用
- 箭头函数不会创建自己的this,call | apply | bind 无法改变箭头函数中this的指向
闭包及其运用
内嵌的函数及它的lexical scoping
private method
继承(vs. Java)
react和vue的区别
TCP三次握手
3-好未来(学而思)
语义化
inline和block
script defer和async
Array的原型链
构造函数 prototype 实例
盒模型 IE和standard box-sizing
flex实现水平垂直居中
flex属性
HTTP caching
vue组件通信
scope 闭包 外访问内
OSI模型
DNS
HTTP缓存
heuristic caching: as much as possible
private cache
shared cache
proxy caches
managed caches
cdn等等
// if both are available max-age is preferred Expires: Tue, 28 Feb 2022 22:22:22 GMT (HTTP/1.0) Cache-Control: max-age = 604800(sec = 1 week) (HTTP/1.1)
Vary: Accept-Language
revalidation: transform a stale response into a fresh one by asking the origin server, done by conditional request
If-Modified-Since If-None-Match ETag
HTTPS
use TLS(transport layer security) to encrypt all communication (ssl = secure sockets layer, old standard security technology, v3.0 Netscape 1996)
TLS handshake
TCP +
1)客户端发起一个http请求,告诉服务器自己支持哪些hash算法。
2)服务端把自己的信息以数字证书的形式返回给客户端(证书内容有密钥公钥,网站地址,证书颁发机构,失效日期等)。证书中有一个公钥来加密信息,私钥由服务器持有。
3)验证证书的合法性
客户端收到服务器的响应后会先验证证书的合法性(证书中包含的地址与正在访问的地址是否一致,证书是否过期)。
4)生成随机密码(RSA签名)
如果验证通过,或用户接受了不受信任的证书,浏览器就会生成一个随机的对称密钥(session key)(随机数)并用公钥加密,让服务端用私钥解密,解密后就用这个对称密钥进行传输了,并且能够说明服务端确实是私钥的持有者。(服务端并不是真的加密这个字符串,而是把字符串进行hash计算后再进行加密后发送给客户端。客户端收到后再解密这个hash值与原来字符串的hash值对比,从而确定对方是否持有私钥。)
5)生成对称加密算法
验证完服务端身份后,客户端生成一个对称加密的算法和对应密钥,以公钥加密之后发送给服务端。此时被黑客截获也没用,因为只有服务端的私钥才可以对其进行解密。之后客户端与服务端可以用这个对称加密算法来加密和解密通信内容了。
跨域解决方法
同源:协议/主机/端口
CORS
Preflight request: 一个 CORS 预检请求是用于检查服务器是否支持 CORS 即跨域资源共享。
它一般是用了以下几个 HTTP 请求首部的
OPTIONS
请求:Access-Control-Request-Method
和Access-Control-Request-Headers
,以及一个Origin
首部Access-Control-Allow-Origin Access-Control-Allow-Methods Access-Control-Allow-Headers Access-Control-Allow-Credentials = true Access-Control-Expose-Headers 允许服务器指示那些响应标头可以暴露给浏览器中运行的脚本,以响应跨源请求。 Access-Control-Max-Age indicates how long the results of a preflight request can be cached
By default, in cross-origin XMLHttpRequest or Fetch invocations, browsers will not send credentials. CORS-preflight requests must never include credentials. When responding to a credentialed request: The server must not specify the “
*
” wildcard for other related headersjsonp
利用了 script 不受同源策略的限制 (脚本的来源取决于脚本所嵌入的资源的来源,比如说访问A主机的当前HTML文件中有一个script标签,这个script标签的src属性请求了一个js脚本,因为这个脚本是由A主机的HTML文件的嵌入的script标签发起请求获取的,因此这个脚本的来源是属于A主机的。)
通过动态添加
<script>
元素,向服务器发出请求缺点:只能 get 方式,易受到 XSS攻击
代理跨域请求(Nginx)
前端向发送请求,经过代理,请求需要的服务器资源
缺点:需要额外的代理服务器
Html5 window.postMessage() 方法
safely enables cross-origin communication between window objects
允许来自不同源的脚本采用异步方式进行有限的通信,可以实现跨文本、多窗口、跨域消息传递
基于 Html5 websocket 协议
websocket 是 Html5 一种新的协议,基于该协议可以做到浏览器与服务器全双工通信,允许跨域请求
修改 document.domain 跨子域
相同主域名下的不同子域名资源,设置 document.domain 为 相同的一级域名
-比特大陆
水平垂直居中
{ display: flex, align-items: center, justify-content: center }
绝对定位 + margin: auto
绝对定位 + 负margin(宽高一半)
{ position: absolute, top: 50%, left: 50%, margin-left: - width/2 margin-top: - height/2 }
绝对定位 + transform
{ position: absolute, top: 50%, left: 50%, transform: translate(-50%, -50%) }
ES6新特性
- const let
- arrow function
- module
- template string
- default paramter
- spead/rest
- destructuring
- class
- symbol
react和vue区别
react class component和function component区别
class组件是有状态的组件,可以定义state状态。 函数组件是无状态的。 class组件有生命周期。 函数组件没有生命周期,函数组件使用的是Hooks。 class组件是有this对象的。
react diff算法
react和vue diff算法的区别
scope 闭包
react hooks
useEffect
useReducer
css flex
虚拟列表
深拷贝、浅拷贝区别 实现
跳出forEach
throw Exception
5-滴滴
虚拟DOM树的本质和作用
本质:JS和dom之间的映射缓存
作用:实现DOM元素的高效更新
HTTP缓存 Header
Cache-Control
防抖、节流 概念实现
防抖(debounce):n 秒后在执行该事件,若在 n 秒内被重复触发,则重新计时
节流(throttle): n 秒内只运行一次,若在 n 秒内重复触发,只有一次生效
想象每天上班大厦底下的电梯。把电梯完成一次运送,类比为一次函数的执行和响应
假设电梯有两种运行策略
debounce
和throttle
,超时设定为15秒,不考虑容量限制电梯第一个人进来后,15秒后准时运送一次,这是节流
电梯第一个人进来后,等待15秒。如果过程中又有人进来,15秒等待重新计时,直到15秒后开始运送,这是防抖
Map的使用
这场面试一上来就是几个当时一点都不会的问题,直接大破防放弃面试,但是面试官人很好,还给了我“克服腼腆,提高沟通交流能力“的建议
6-ThunderBit
消息订阅模式
初创公司,创始人都有美国大厂背景,挺有人格魅力的,可惜没去成
7-鳄梨科技
笔试
- 层叠上下文(stacking context)
- 文档根元素(
<html>
); position
值为absolute
(绝对定位)或relative
(相对定位)且z-index
值不为auto
的元素;position
值为fixed
(固定定位)或sticky
(粘滞定位)的元素(沾滞定位适配所有移动设备上的浏览器,但老的桌面浏览器不支持);- flex (
flex
) 容器的子元素,且z-index
值不为auto
; - grid (
grid
) 容器的子元素,且z-index
值不为auto
; opacity
属性值小于1
的元素(参见 the specification for opacity);mix-blend-mode
属性值不为normal
的元素;- 以下任意属性值不为none的元素:
isolation
属性值为isolate
的元素;will-change
值设定了任一属性而该属性在 non-initial 值时会创建层叠上下文的元素(参考这篇文章);contain
属性值为layout
、paint
或包含它们其中之一的合成值(比如contain: strict
、contain: content
)的元素。
- content, padding, border, margin
8-网易
强缓存与协商缓存的区别
强缓存:浏览器不与服务端协商直接取浏览器缓存
协商缓存:浏览器会先向服务器确认资源的有效性后才决定是从缓存中取资源还是重新获取资源 (304 Not Modified)
react生命周期
挂载
- constructor
- getDerivedStateFromProps
- render
- componentDidMount
更新
- getDerivedStateFromProps
- shouldComponentUpdate
- render
- getSnapshotBeforeUpdate
- componentDidUpdate
卸载
- componentWillUnmount
http响应码
深拷贝浅拷贝
深拷贝实现
堆上新建了一份对象
- 递归
- 序列化与反序列化
- structuredClone(value, options)
浅拷贝实现
原生 赋值 对象 复制内存地址
Object.assign()
const let
数组
splice 原地,可新加(相当于unshift)
slice 新数组, 返回切出来的部分
splice(start) splice(start, deleteCount) splice(start, deleteCount, item1) splice(start, deleteCount, item1, item2) splice(start, deleteCount, item1, item2, /* …, */ itemN) slice() slice(start) slice(start, end)
flex gap
css 画三角形
border实现
.triangle { width: 0; height: 0; border: 100px solid; border-color: orangered skyblue gold yellowgreen; }
三个方向设置透明一个方向设置颜色
盒模型
animation vs. transition
他们虽然都可以做出动画效果,但是transition主要做简单的过渡效果,而animation可以做复杂的动画效果,在语法和用法上有非常大的区别。
transition是过渡属性,强调过渡,他的实现需要触发一个事件(比如鼠标移动上去,焦点,点击等)才执行动画,过渡只有一组(两个:开始-结束)关键帧。
animation是动画属性,他的实现不需要触发事件,设定好时间之后可以自己执行,且可以循环一个动画(设置多个关键帧)。
v-if, v-show
ref, reactive
ref()
函数可以接受原始类型(最常见的是布尔值、字符串和数字)以及对象作为参数,而reactive()
函数只能接受对象作为参数。ref()
有一个.value
属性,你必须使用.value
属性获取内容,但是使用reactive()
的话可以直接访问- 使用
ref()
函数可以替换整个对象实例,但是在使用reactive()
函数时就不行
响应码处理
伪类 伪元素
instanceof
hash 模式
hash 模式是一种把前端路由的路径用井号
#
拼接在真实 URL 后面的模式。当井号#
后面的路径发生变化时,浏览器并不会重新发起请求,而是会触发hashchange
事件。history 模式
history API 是 H5 提供的新特性,允许开发者直接更改前端路由,即更新浏览器 URL 地址而不重新发起请求。
二面因拿到百度offer放弃
9-迈步科技
输入网址到页面呈现的过程
URL解析:浏览器解析输入的URL,提取出协议、主机、端口、路径等信息。
DNS解析:浏览器使用主机名查询DNS服务器,获取对应的IP地址。
建立TCP连接:浏览器使用获取到的IP地址和端口号,与服务器建立TCP连接。这涉及到三次握手的过程。
发送HTTP请求:一旦TCP连接建立,浏览器向服务器发送HTTP请求。请求的内容包括请求方法、请求头和请求体。
服务器处理请求:服务器接收到浏览器发送的HTTP请求后,根据请求的路径和参数,处理请求并准备响应。
服务器返回响应:服务器根据请求的处理结果,生成相应的HTTP响应。响应的内容包括响应状态码、响应头和响应体。
接收响应:浏览器接收到服务器返回的HTTP响应。
渲染页面:浏览器开始解析接收到的响应内容,构建DOM树、CSSOM树和渲染树。然后进行布局和绘制,最终将页面呈现在屏幕上。
页面展示:页面渲染完成后,浏览器将页面展示给用户,用户可以看到页面内容并与页面进行交互。
cookie和session的区别
1. Session : A session is used to save information on the server momentarily so that it may be utilized across various pages of the website. It is the overall amount of time spent on an activity. The user session begins when the user logs in to a specific network application and ends when the user logs out of the program or shuts down the machine.
Session values are far more secure since they are saved in binary or encrypted form and can only be decoded at the server. When the user shuts down the machine or logs out of the program, the session values are automatically deleted. We must save the values in the database to keep them forever.
2. Cookie : A cookie is a small text file that is saved on the user’s computer. The maximum file size for a cookie is 4KB. It is also known as an HTTP cookie, a web cookie, or an internet cookie. When a user first visits a website, the site sends data packets to the user’s computer in the form of a cookie.
The information stored in cookies is not safe since it is kept on the client-side in a text format that anybody can see. We can activate or disable cookies based on our needs.
Cookie Session Cookies are client-side files on a local computer that hold user information. Sessions are server-side files that contain user data. Cookies end on the lifetime set by the user. When the user quits the browser or logs out of the programmed, the session is over. It can only store a certain amount of info. It can hold an indefinite quantity of data. The browser’s cookies have a maximum capacity of 4 KB. We can keep as much data as we like within a session, however there is a maximum memory restriction of 128 MB that a script may consume at one time. Because cookies are kept on the local computer, we don’t need to run a function to start them. To begin the session, we must use the session start() method. Cookies are not secured. Session are more secured compare than cookies. Cookies stored data in text file. Session save data in encrypted form. Cookies stored on a limited data. Session stored a unlimited data. We can set an expiration date to delete the cookie’s data. It will automatically delete the data at that specific time. In PHP, to destroy or remove the data stored within a session, we can use the session_destroy() function, and to unset a specific variable, we can use the unset() function 具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。
同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制
来达到保存标识的目的,但实际上它还有其他选择。
cookie机制。正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示
浏览器按照指示生成相应的cookie。然而纯粹的客户端脚本如JavaScript或者VBScript也可以生成cookie。而cookie的使用
是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围
大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。
Set-Cookie: <cookie-name>=<cookie-value> Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value> Set-Cookie: <cookie-name>=<cookie-value>; Expires=<date> Set-Cookie: <cookie-name>=<cookie-value>; HttpOnly Set-Cookie: <cookie-name>=<cookie-value>; Max-Age=<number> Set-Cookie: <cookie-name>=<cookie-value>; Partitioned Set-Cookie: <cookie-name>=<cookie-value>; Path=<path-value> Set-Cookie: <cookie-name>=<cookie-value>; Secure Set-Cookie: <cookie-name>=<cookie-value>; SameSite=Strict Set-Cookie: <cookie-name>=<cookie-value>; SameSite=Lax Set-Cookie: <cookie-name>=<cookie-value>; SameSite=None; Secure // Multiple attributes are also possible, for example: Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>; Secure; HttpOnly
cookie的内容主要包括:名字,值,过期时间,路径和域。路径与域一起构成cookie的作用范围。若不设置过期时间,则表示这
个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。这种生命期为浏览器会话期的cookie被称为会话cookie。
会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。若设置了过期时间,浏览器就会把cookie
保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在不同的浏
览器进程间共享,比如两个IE窗口。而对于保存在内存里的cookie,不同的浏览器有不同的处理方式session机制。session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。
当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识
(称为session id),如果已包含则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来
使用(检索不到,会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相
关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应
中返回给客户端保存。保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给
服务器。一般这个cookie的名字都是类似于SEEESIONID。但cookie可以被人为的禁止,则必须有其他机制以便在cookie被禁止时
仍然能够把session id传递回服务器。经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面。还有一种技术叫做表单隐藏字段。就是服务器
会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。
Cookie总是保存在客户端中,按在客户端中的存储位置,可分为会话Cookie和持久Cookie
react生命周期
get和post区别
(1)post更安全(不会作为url的一部分,不会被缓存、保存在服务器日志、以及浏览器浏览记录中) (2)post发送的数据更大(get有url长度限制) (3)post能发送更多的数据类型(get只能发送ASCII字符)
GET用于获取信息,是无副作用的,是幂等的,且可缓存POST用于修改服务器上的数据,有副作用,非幂等,不可缓存
在约定中,GET方法的参数应该放在 url 中,POST方法参数应该放在 body 中
useState useRef
Promise的理解
热加载 原理
webpack
git命令
linux命令
25匹马求最快的3匹
最近读的一本书
10-货拉拉
盒模型
position
是否在流里
absolute和fixed被移出flow
The element is positioned according to the normal flow of the document. The
top
,right
,bottom
,left
, andz-index
properties have no effect. This is the default value.The element is positioned according to the normal flow of the document, and then offset relative to itself based on the values of
top
,right
,bottom
, andleft
. The offset does not affect the position of any other elements; thus, the space given for the element in the page layout is the same as if position werestatic
.This value creates a new stacking context when the value of
z-index
is notauto
. Its effect ontable-*-group
,table-row
,table-column
,table-cell
, andtable-caption
elements is undefined.The element is removed from the normal document flow, and no space is created for the element in the page layout. The element is positioned relative to its closest positioned ancestor (if any) or to the initial containing block. Its final position is determined by the values of
top
,right
,bottom
, andleft
.This value creates a new stacking context when the value of
z-index
is notauto
. The margins of absolutely positioned boxes do not collapse with other margins.The element is removed from the normal document flow, and no space is created for the element in the page layout. The element is positioned relative to its initial containing block, which is the viewport in the case of visual media. Its final position is determined by the values of
top
,right
,bottom
, andleft
.This value always creates a new stacking context. In printed documents, the element is placed in the same position on every page.
The element is positioned according to the normal flow of the document, and then offset relative to its nearest scrolling ancestor and containing block (nearest block-level ancestor), including table-related elements, based on the values of
top
,right
,bottom
, andleft
. The offset does not affect the position of any other elements.This value always creates a new stacking context. Note that a sticky element “sticks” to its nearest ancestor that has a “scrolling mechanism” (created when
overflow
ishidden
,scroll
,auto
, oroverlay
), even if that ancestor isn’t the nearest actually scrolling ancestor.BFC
Formatting context 是 W3C CSS2.1 规范中的一个概念。它是页面中的一块渲染区域,并且有一套渲染规则,它决定了其子元素将如何定位,以及和其他元素的关系和相互作用。最常见的 Formatting context 有 Block fomatting context (简称BFC)和 Inline formatting context (简称IFC)。
Block Formatting Context(区块格式化上下文)
- 内部的Box会在垂直方向,一个接一个地放置。
- Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠。
- 每个盒子(块盒与行盒)的margin box的左边,与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。
- BFC的区域不会与float box重叠。
- BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。
- 计算BFC的高度时,浮动元素也参与计算。
产生
- The root element of the document (
<html>
). - Floats (elements where
float
isn’tnone
). - Absolutely positioned elements (elements where
position
isabsolute
orfixed
). - Inline-blocks (elements with
display
: inline-block
). - Table cells (elements with
display
: table-cell
, which is the default for HTML table cells). - Table captions (elements with
display
: table-caption
, which is the default for HTML table captions). - Anonymous table cells implicitly created by the elements with
display
: table
,table-row
,table-row-group
,table-header-group
,table-footer-group
(which is the default for HTML tables, table rows, table bodies, table headers, and table footers, respectively), orinline-table
. - Block elements where
overflow
has a value other thanvisible
andclip
. display
: flow-root
.- Elements with
contain
: layout
,content
, orpaint
. - Flex items (direct children of the element with
display
: flex
orinline-flex
) if they are neither flex nor grid nor table containers themselves. - Grid items (direct children of the element with
display
: grid
orinline-grid
) if they are neither flex nor grid nor table containers themselves. - Multicol containers (elements where
column-count
orcolumn-width
isn’tauto
, including elements withcolumn-count: 1
). column-span
: all
should always create a new formatting context, even when thecolumn-span: all
element isn’t contained by a multicol container (Spec change, Chrome bug).
数组方法 原地与否
find (没有undefined
filter
Mutating method Non-mutating alternative copyWithin()
No one-method alternative fill()
No one-method alternative pop()
slice(0, -1)
push(v1, v2)
concat([v1, v2\])
reverse()
toReversed()
shift()
slice(1)
sort()
toSorted()
splice()
toSpliced()
unshift(v1, v2)
toSpliced(0, 0, v1, v2)
ES6新特性
事件循环
var let const
响应式
- media query
- 百分比
- rem布局 (
rem
单位都是相对于根元素html的font-size
来决定大小的) - vw/vh
Object方法 Object.keys(), Object.values(), Object.entries()
Object.create, Object.is, Object.getPrototypeOf(), Object.setPrototypeOf(), Object.assign(), Object.defineProperty()
防抖节流
闭包
闭包(closure)是一个函数以及其捆绑的周边环境状态(lexical environment,词法环境)的引用的组合。
缺点
延长生命周期,内存消耗大,内存泄漏
由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。 解决方法是,在退出函数之前,将不使用的局部变量全部删除。
原型链
vue通信
vue响应式原理
Object.defineProperty
get set方法追踪依赖,在 property 被访问和修改时通知变更页面展现过程
post 和 get
深浅拷贝
算法题 Set,Map
Set(iterable)
项目中最难的点
字符串去重 两种
11-百度 基础架构
难点,如何解决,解决之后有没有形成一些方法论
CD实现原理
持续集成的工作原理是将小的代码块推送到Git仓库中托管的应用程序代码库中,并且每次推送时,都要运行一系列脚本来构建、测试和验证代码更改,然后再将其合并到主分支中。
持续交付和部署相当于更进一步的CI,可以在每次推送到仓库默认分支的同时将应用程序部署到生产环境。
ref和reactive的区别
vue3的响应性
Proxy
Vue2: Object.defineProperty(), get set方法
虚拟dom
vue3 diff算法
vue3 hook
http是什么,结构,解决什么问题,注意的点,版本及其区别,方法及其区别,报文结构
跨域
flex flex-basis和width谁优先,flex上下左右居中
block formatting context, 解决margin重叠
父元素设置border和padding?
stacking context,生效策略
二面因拿到另一个部门的offer而取消
12-百度 工程效能
一面
es6新特性
vue2到vue3
三角形
扁平化 flatten
promise.any
settled: fulfilled or rejected
resolved: settled or ’locked-in’ to match the eventual state of another promise.
css优先级
二面
http状态码
tcp和udp
udp变可靠
最简单的方式是在应用层模仿传输层TCP的可靠性传输。下面不考虑拥塞处理,可靠UDP的简单设计。
- 1、添加seq/ack机制,确保数据发送到对端
- 2、添加发送和接收缓冲区,主要是用户超时重传。
- 3、添加超时重传机制。
es6新特性
常用hook
useMemo和useCallback区别
useMemo
和useCallback
接收的参数都是一样,第一个参数为回调 第二个参数为要依赖的数据共同作用: 1.仅仅
依赖数据
发生变化, 才会重新计算结果,也就是起到缓存的作用。两者区别: 1.
useMemo
计算结果是return
回来的值, 主要用于 缓存计算结果的值 ,应用场景如: 需要 计算的状态 2.useCallback
计算结果是函数
, 主要用于 缓存函数,应用场景如: 需要缓存的函数,因为函数式组件每次任何一个 state 的变化 整个组件 都会被重新刷新,一些函数是没有必要被重新刷新的,此时就应该缓存起来,提高性能,和减少资源浪费。useMemo的作用
实现useCounter
实现 objDiff
总结
不要等到准备周全才开始面试,边面边学,熟能生巧
自我介绍,表达能力,如何展示自己很重要
可以考虑从事更有门槛的赛道
要自信