字节一面

一、字节跳动

1、自我介绍

2、React用得多还是Vue用得多?

我之前在学校阶段用 Vue 比较多,因为很多课程项目是基于 Vue 做的。后来在实习以及之后的项目中主要使用的是 React,目前主要技术栈是 React + TypeScript。React 的函数式组件和 Hooks 体系让我在状态管理和逻辑复用方面感觉更灵活,所以现在用 React 会更多一些。

3、React用的什么版本?React19有哪些新特性?

我主要使用的是 React 18。React18比较重要的特性包括并发渲染、自动批处理、useTransition 等。

React19新增的一些能力主要包括:

  • Actions:简化表单提交和异步状态更新逻辑
  • use hook:可以直接读取 Promise 或 Context 数据
  • Server Components 更稳定:更好支持服务端组件
  • 缓存机制增强:例如 cache() API
  • 更好的错误处理与资源加载能力 整体上 React19 更加强化了 服务端渲染和数据获取能力

4、React常用hooks有哪些?

常用的 Hooks 主要包括:

  • useState:用于在函数组件中管理状态
  • useEffect:处理副作用,比如请求数据、订阅事件等
  • useRef:获取 DOM 节点或者保存可变值
  • useMemo:缓存计算结果,避免重复计算
  • useCallback:缓存函数引用,避免子组件重复渲染
  • useContext:跨组件传递数据

除此之外还有一些进阶的 Hooks,比如 useReduceruseLayoutEffectuseTransition 等。

5、setState之后React做了什么?

当调用 setStateuseState 的更新函数后,大致流程是:

  1. React 会先 创建新的 Fiber 节点并标记更新
  2. 进入 调度阶段(Scheduler) ,React会根据优先级调度更新任务
  3. 进入 Reconciliation 阶段(Diff阶段) ,比较新旧虚拟 DOM
  4. 找出需要更新的节点
  5. 进入 Commit阶段,把变更真正应用到真实 DOM 上

在 Commit 阶段还会执行:

  • DOM 更新
  • layout effect
  • effect

6、React为什么只更新部分DOM?React Diff算法是什么?

React之所以只更新部分 DOM,是因为使用了 虚拟 DOM + Diff 算法

React在状态变化后,会生成一棵新的虚拟DOM树,然后与旧的虚拟DOM进行比较,通过 Diff 算法找出发生变化的节点,只更新这些节点,而不是整棵DOM树。

React Diff算法的核心原则有三个:

  1. 只比较同一层级的节点,不同层级直接替换
  2. 如果节点类型不同,直接销毁旧节点并创建新节点
  3. 列表节点通过 key 来进行优化比较

这样可以把时间复杂度从 O(n³) 优化到 O(n)。

7、React什么时候复用节点?key的作用是什么?

React在 Diff 过程中,如果满足以下条件,就会复用节点:

  • 节点类型相同,例如都是 div
  • key 值相同

如果 key 不同,React 会认为是新的节点,从而重新创建。

key 的作用主要是:

  1. 唯一标识列表元素
  2. 帮助 React 在 Diff 过程中识别节点
  3. 提高列表更新效率,减少不必要的 DOM 操作

通常在列表渲染时都会使用稳定的唯一 key,比如 id。

8、浏览器页面渲染流程是什么?HTML解析过程中遇到JS会发生什么?

浏览器渲染流程大致如下:

  1. 浏览器解析 HTML,生成 DOM Tree
  2. 解析 CSS,生成 CSSOM Tree
  3. DOM Tree 和 CSSOM Tree 合并生成 Render Tree
  4. 进行 Layout(布局) ,计算元素的位置和大小
  5. 进行 Paint(绘制) ,绘制页面内容
  6. 最后进行 Composite(合成) ,由 GPU 合成最终页面

如果在 HTML 解析过程中遇到 普通的 script 标签,浏览器会:

  • 暂停 HTML 解析
  • 下载并执行 JS
  • JS执行完后再继续解析 HTML

原因是 JavaScript 可能会修改 DOM 结构,所以浏览器需要保证执行顺序。

9、HTTP有哪些版本?HTTP2有什么特点?HTTP3为什么更快?TCP和UDP有什么区别?

HTTP常见版本有:

  • HTTP1.0
  • HTTP1.1
  • HTTP2
  • HTTP3

HTTP2主要特点包括:

  • 二进制分帧
  • 多路复用:一个连接可以并发多个请求
  • 头部压缩(HPACK)
  • Server Push:服务器可以主动推送资源

HTTP3相比HTTP2更快的原因是:

HTTP3基于 QUIC协议,而QUIC是基于 UDP 实现的。

优点包括:

  • 减少连接建立时间
  • 支持 0-RTT
  • 避免 TCP 队头阻塞问题
  • 连接迁移能力更好

TCP和UDP的区别:

TCP是 面向连接、可靠传输的协议,需要三次握手,保证数据完整性。

UDP是 无连接协议,不保证数据可靠,但传输速度更快,延迟更低。

10、防抖和节流

import React, { useState, useRef } from "react";

// 防抖function debounce(fn, delay) {let timer = null;return function (...args) {if (timer) clearTimeout(timer);timer = setTimeout(() => {fn.apply(this, args);}, delay);};}

// 节流function throttle(fn, delay) {let lastTime = 0;return function (...args) {const now = Date.now();if (now - lastTime > delay) {fn.apply(this, args);lastTime = now;}};}

export default function Search() {const [value, setValue] = useState("");

const request = (v) => {console.log("search:", v);// 这里可以调用真实接口};

const debounceSearch = useRef(debounce(request, 500));const throttleSearch = useRef(throttle(request, 2000));

const handleChange = (e) => {const v = e.target.value;setValue(v);

// 防抖:停止输入后触发
debounceSearch.current(v);

// 节流:持续输入也会每2秒触发一次
throttleSearch.current(v);

};

return (<inputvalue={value}onChange={handleChange}placeholder="请输入搜索内容"/>);}

11、TS工具类型

Record<K,T>

构造对象类型

type Obj = Record<string, number>

Pick<T,K>

选择部分属性

type A = Pick<User, "name" && "age">

Omit<T,K>

删除属性

type A = Omit<User, "address">

Partial<T>

所有属性变可选

type A = Partial<User>

Required<T>

所有属性变必填

type A = Required<User>

Readonly<T>

所有属性只读

type A = Readonly<User>

12、算法

判断一个字符串是不是 **累加数字符串**:

-   从**前两个数字**开始
-   后面每一个数 = 前面**相邻两个数之和**
-   整个字符串要**刚好分割**成这样的数列,不能剩、不能缺

例子(对的):`"199100199"`分割:`1, 99, 100, 199`1+99=100,99+100=199 

function isAdditiveNumber(num) {
  const n = num.length
  for(let i = 1; i < n; i++){
    for(let j = i + 1; j < n; j++){
      let a = BigInt(num.slice(0,i))
      let b = BigInt(num.slice(i,j))
      let k = j
      while(k < n){
        let sum = a + b
        let s = sum.toString()
        if(num.slice(k, k + s.length) !== s){
          break
        }
        k += s.length
        a = b
        b = sum
      }
      if(k === n){
        return true
      }
    }
  }
  return false
}

全部评论
可以问一下是哪个部门吗
点赞 回复 分享
发布于 昨天 11:59 江苏
佬今天刚面的吗,哪个部门呀
点赞 回复 分享
发布于 03-12 23:22 四川

相关推荐

03-12 12:54
已编辑
武汉理工大学 前端工程师
一面&nbsp;2.10##&nbsp;预计时长60min##&nbsp;实际时长51min1.&nbsp;对于部门的背景和这次面试有什么想问的吗2.&nbsp;我看到你现在是在百度实习,可以讲讲这个业务吗3.&nbsp;跨端做的是IOS还是安卓4.&nbsp;你对整个架构有什么理解吗,比如离线包这一块,比如离线包解决什么样的问题,离线包是怎么下发和更新的5.&nbsp;如果说不用离线包,在app上打开一个http地址,这个页面会有什么问题6.&nbsp;离线包除了快还有什么优势7.&nbsp;React18新特性有了解吗8.&nbsp;在没有这些特性之前,react是怎么调度的,有了之后是怎么调度的9.&nbsp;fiber本身是为了解决什么样的问题10.&nbsp;如果没有fiber,diff的时候会怎么样,会不会有一些性能瓶颈11.&nbsp;平时ts用的多吗12.&nbsp;讲讲泛型,如果现在要通过泛型传入一个string进去,希望推导出来的结果也是string,怎么做13.&nbsp;平时用vue还是react多一点14.&nbsp;讲一下react中常用的hooks15.&nbsp;useLayoutEffect和useEffect有什么区别16.&nbsp;useEffect中可以返回一个函数,这个函数什么时候会执行17.&nbsp;平时有没有对项目做一些性能优化18.&nbsp;除了资源相关的优化,还能在哪些方面做优化19.&nbsp;在浏览器中从输入URL到页面加载完毕的过程是什么(引出可优化的内容)20.&nbsp;有了解过http2.0吗,可以讲一下他的一些特性吗21.&nbsp;二进制帧如果丢失,重传机制是怎么样的22.&nbsp;TCP和UDP的区别23.&nbsp;TCP是怎么去实现可靠传输的手撕:深拷贝(后续又延伸问了处理除了对象和数组类型之外的数据的思路)24.&nbsp;反问及建议二面&nbsp;2.11预计45min实际90min1.&nbsp;自我介绍2.&nbsp;介绍一下实习期间项目里面的一些技术难点,具体是怎么解决的3.&nbsp;针对刚刚提到的具体的优化,量化指标是怎么样的,如何验证优化是否有效4.&nbsp;再针对个人项目里面,挑一个难点讲一下,想听到的是分析过程,如何拆解问题5.&nbsp;共享屏幕启动项目看效果6.&nbsp;代码是AI写的还是自己写的7.&nbsp;用的是什么AI,怎么去使用ai来完成一个功能或一个项目8.&nbsp;有没有在ai的rules或者skills方面做具体的沉淀算法:1.&nbsp;LRU缓存2.&nbsp;大数相加,自己去写一些测试用例并验证3.&nbsp;思考题:现在有假设一栋楼有100层,你有两个玻璃球,有些楼层扔下去球会碎,有些不会碎,你需要利用这两个球,找到那个临界楼层,最优的解法是什么反问二面狂面90分钟直接燃尽,面完过年了一直到年后才约面三面&nbsp;3.4预计时长:60min实际时长:68min##&nbsp;1.&nbsp;自我介绍##&nbsp;2.&nbsp;聊实习##&nbsp;3.&nbsp;有没有考虑过计费或者说成本,或者说对于服务端的压力,比如说CDN的(针对实习亮点)##&nbsp;4.&nbsp;对于国际化开发和国内开发的区别,有没有什么心得感受##&nbsp;5.&nbsp;多语言工具用的是什么,原理是什么##&nbsp;6.&nbsp;怎么判断用户当前应该使用的是什么语言##&nbsp;7.&nbsp;实习中还有什么对自己提升是比较大的##&nbsp;8.&nbsp;对于跨端架构的几种方案,如何进行选择(h5,native等)##&nbsp;9.&nbsp;现在在跨端架构中如果使用webview加载离线包的方案,如果在端内点击一个下载按钮,整个调用链路和过程是怎么样的##&nbsp;10.&nbsp;端侧的方法是如何注入到web中的##&nbsp;11.&nbsp;聊个人项目,做这个项目的初衷是什么,为了解决什么问题##&nbsp;12.&nbsp;项目中的ai主要用来解决什么问题##&nbsp;13.&nbsp;调用一次模型成本是多少,输入和输出谁消耗的token更多##&nbsp;14.&nbsp;langchain.js框架解决了什么事情##&nbsp;15.&nbsp;现在写代码都是自己写吗,如何使用好ai##&nbsp;16.&nbsp;实习过程中团队会去应用rules或者skills吗,是怎么用的,是为了解决什么问题##&nbsp;17.&nbsp;如果现在对于这几个月的实习去做一个总结,会从哪些方面去进行总结##&nbsp;18.&nbsp;实习过程中有没有存在对于一个需求,自己方案和mt的方案不一致的情况,如果有,是怎么解决的##&nbsp;19.&nbsp;反问HR面&nbsp;3.6都是常规问题3.12&nbsp;offer
点赞 评论 收藏
分享
03-10 11:23
门头沟学院 Java
点赞 评论 收藏
分享
评论
9
31
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务