2020.5--近期遇到的前端问题

170 阅读3分钟

记录前端面试题,有误的地方请指出

1.parseInt('3', 2) 返回值是什么?为什么?

答:返回NaN, parseInt传参为两个时,第一个参数是需要被转换的值,第二个参数是作为当前转换的基础进制,perseInt
会将第一个参数按照第二个参数设置的基础进制进行转换后,再转换为10进制。因为2进制里最大值是1,所以3无法被转换
为二进制,故返回NaN。

2.redux如何处理异步action

答:项目里使用redux的中间件redux-thunk来处理, redux-thunk接受action返回一个函数,并将dispatch作为默认参数传入
    // 使用
    import { createStore, applyMiddleware } from 'redux';
    import thunk from 'redux-thunk'; //导入thunk
    import rootReducer from './reducers/index';
    const store = createStore(
      rootReducer,
      applyMiddleware(thunk)//激活thunk中间件
    );
    
    //action
    const getList = () => dispatch => {
        axios(config)
            .then(res => {
                dispath(....)
            })
    }

3.react-hooks 函数组件更新后useState是如何拿到更新前的值,

答:react组件在初次渲染时,会将useState(声明的state)和useEffect(依赖的数组)按照声明顺序存入
memoizedState数组中,组件更新时,再按照顺序读取上次更新前的值

(相关问题:
Q:为什么只能在函数最外层调用 Hook?为什么不要在循环、条件判断或者子函数中调用。
A:memoizedState 数组是按 hook定义的顺序来放置数据的,如果 hook 顺序变化,memoizedState 并不会感知到。

Q:自定义的 Hook 是如何影响使用它的函数组件的?
A:共享同一个 memoizedState,共享同一个顺序。

Q: memoizedState,cursor 是存在哪里的?如何和每个函数组件一一对应的?
A:react 会生成一棵组件树(或Fiber 单链表),树中每个节点对应了一个组件,hooks的数据就作为组件的一个信息,存储在这些节点上,
伴随组件一起出生,一起死亡。得到的得到的)

4.讲一讲强缓存和协商缓存

访问网页时,浏览器会自动在本地缓存当前网页的资源,在下次访问时,浏览器会根据当前网页的
缓存策略去拿本地缓存或者重新请求,强缓存就是由后端直接在响应体内添加expires或者
cache-contral 设置过期时间来控制,当下次请求时间超过设置的缓存时间后,就会重新请求,协商缓存是由客户端请求体
与服务端响应体内对应字段的资源ID进行校验:优先级(Etag&If-None-Match > Last-Modified&If-Modified-Since)

简单说:
对于强制缓存,服务器通知浏览器一个缓存时间,在缓存时间内,下次请求,直接用缓存,不在时间内,执行比较缓存策略。
对于比较缓存,将缓存信息中的Etag和Last-Modified通过请求发送给服务器,由服务器校验,
返回304状态码时,浏览器直接使用缓存。

5.let是否存在声明提升,暂时性死区是怎么出现的

答:存在,在js中,创建一个变量的过程大致为:创建-初始化-赋值,var变量的创建和初始化都被提升了(创建时,默认初
始化为undefined,let和const的创建过程被提升,但是初始化没有被提升,当变量没有被初始化时,就无法使用,所以就出
现了暂时性死区。