字节跳动 - 商业化技术
投递渠道: 简历直推
TIP
值得一提的是,这是我人生中第一场求职面试。当时看群友说组内要 25 届可以简历直推,就加好友发了简历,没想到单薄的简历通过了筛选,稀里糊涂地约面了.处女面给了字节,不出意外一面就挂了.
也算是打响前端面试第一枪哈哈哈哈哈
面试时间: 2023-07-26
一面
- 为什么选择前端?
- 聊了一下简历上写的获奖经历具体做了什么
- CSS 盒模型
- Github 发现最近在用 tailwindCSS 问我用起来的感受,有什么优点
- 有没有了解过模块化 CSS
- HTTP 状态码
- 由上一问的 304 引出浏览器的缓存机制
- js 原型链相关
- 判断数据类型有哪些方法
- Vue 响应式原理
- 同源策略与跨域解决方案
- webpack 和 npm 前端工程化相关
手撕代码:
- 给定形如
a.b.c.d
的字符串,构造一个对象如下:{ a:{ b:{ c:{ d:null } } } }
- 合并两个有序数组
Momenta
投递渠道: BOSS 直聘
时间线
- 2023-11-24 投递简历
- 2023-11-28 下午一面,结束后立马约二面
- 2023-11-29 上午二面,中午 OC
- 2023-12-04 发放正式 Offer
一面
- 青训营经历简单介绍
- 手撕算法: 56. 合并区间,要求原地操作数组.
- 反问环节
二面
- 如何调试 hover 样式(我的回答是开发者工具中可以勾选,但是存在不够精确的问题)
- 除了使用 vercel 之外,有没有自己去尝试过部署前端项目
- 有没有用过 Docker
- 浏览器跨域解决方案
- 有没有用过 iframe 标签
- git rebase 有用过吗(没有,但是个人比较常用 git stash)
- 介绍一下青训营的项目 -> NPM 的扁平化安装机制
- 关于事件循环的一个场景题: 在 JavaScript 中,你在一段同步代码中创建了一个 Promise。然后,在代码的末尾,你编写了一个 while(flag)循环来阻塞程序的执行。你的计划是在 Promise 的回调函数中将 flag 设置为 false,这样就可以退出这个循环。然而,由于 JavaScript 的事件循环机制,这种做法在 JavaScript 中是行不通的。有没有什么方法可以让这种情况在 JavaScript 中成为可能。
- 前端工具链: Rollup / Webpack / Vite 的使用经验与理解
- UI 组件测试是否了解
- TailwindCSS 暗黑模式布局是如何实现的,常规 CSS 如何实现暗黑模式的布局
- 虚拟滚动技术如何实现的
- 项目中的防抖具体是如何实现与应用的
- 反问
滴滴
投递渠道: BOSS 直聘
时间线
- 2023-11-23 投递简历
- 2023-11-29 约面
- 2023-12-01 一面
一面
- 介绍一下青训营的项目,在其中扮演了怎样的角色
- CSS 定位有哪些 -> 讲讲 sticky
- Webpack 的使用情况
- 浏览器从输入 URL 到页面呈现的过程发生了什么
- 同源策略与跨域解决方案
手撕代码:
- 对象数组根据 key 值去重
[
{ "key": 1, "value": "Tom" },
{ "key": 1, "value": "Jack" },
{ "key": 2, "value": "Anna" }
]
- 嵌套对象数组根据 key 值去重
[
{
"key": 1,
"value": "Tom",
"children": [
{ "key": 4, "value": "John" },
{ "key": 4, "value": "Linda" }
]
},
{ "key": 1, "value": "Jack" },
{ "key": 2, "value": "Anna", "children": [{ "key": 1, "value": "Jack" }] }
]
- 判断回文字符串
emmmm,八股答得也还行,手撕代码也全都做出来了,但是没有后续流程了...
零一跃动
投递渠道: BOSS 直聘
面试时间: 2023-11-19
题外话
当天投递当天约面,之前在 BOSS 一直没人回复,更新简历后立马有人约面了!
建议在下午三点发起对话,好像回复率很高!
- 自我介绍
- 挑选一个项目进行详细介绍
- 项目的技术选型是怎么考虑的
- 说一下不同技术选型给你带来的体验
(这里我提到了 js 和 ts 在类型提示上的区别以及普通 css 与 tailwind 的区别)
- 项目中与后端接口联调的流程是怎样的
- 在你使用 tailwind 时遇见复杂的样式如何处理(老老实实回归普通 css)
- 盒子模型:
content-box
与border-box
- 防抖节流: 说一下应用场景与口胡实现原理
- 项目中用到过哪些组件通信的方式(答得感觉不是很满意,我真的只用过 props 与 emit 😭)
- 深拷贝实现方式(JSON 与手写深拷贝)
- 对 async/await 与 Promise 的理解(解决回调地狱的问题,语法糖提高代码可读性)
- 平常开发中如何进行代码调试
- Vue 中 key 的作用(与 diff 算法相关,为了更好的复用 DOM 节点,提高渲染性能)
- 如果一个列表中有两个元素的 key 值相同,那么会带来什么影响(错误更新)
- 什么时候接触前端?对后端有了解吗?
- 反问。
半小时结束,当晚约线下详谈。
话树网络
投递渠道: BOSS 直聘
时间线
- 2023-11-15 下午投递,当晚发送笔试邮件
- 2023-11-20 约面
- 2023-11-24 面试
- 自我介绍
- 对于 H5 语义化标签的理解
- 逻辑像素与物理像素是什么,如何去调整?(答得不是很好)
- 单页面应用和服务端渲染应用的区别 ❌
- 如何实现一个简单的 loading 遮罩
- relative / absolute / fixed 定位的区别 🍧
- 实现一个元素的显示和隐藏,以及不同方法的区别 🍩
- 回流与重绘
- V-if 与 V-show 的区别
- Vue 中 key 的作用
- CSS 盒模型
- outline 属性是否会占用宽度
- flex: 1 是什么的简写,以及三个属性的含义 🏃♂️
- for...of... 与 for...in... 的区别
- Vue 修饰符 .prevent 与 .stop 的区别
- 事件冒泡与事件捕获
- 弱等于(==) 与 强等于(===) 的区别
- 类型转换 0 == false 的结果
- Vuex 与 Pinia 在设计上的优势与劣势
- Vuex 中有 Mutation 的操作,为什么 Pinia 中没有
- 用过 hooks 吗
- reactive 与 ref 在使用上有什么区别
- Vue 响应式原理(开始吟唱 🥰!)
- 设计模式相关,了解工厂模式吗
- 了解 CDN 吗?是为了解决什么问题,具体的原理是怎样的
- 怎样学习前端的
- 阅读英文文档有问题吗,开始闲聊....
结束后,约线下简单笔试。
卫翎科技
投递渠道: BOSS 直聘
时间线
- 2023-11-23 上午 hr 发起打招呼,遂投递简历,下午约面
- 2023-11-27 一面
- 2023-11-29 上午约二面, 下午二面
一面
- 自我介绍
- 字节青训项目中最有挑战或者收获的点
- lint-staged 的主要作用是什么(搭配 husky 在 commit 时进行代码检查,面试官补充说只对暂存区的代码进行检查)
- Vuex 与 Pinia 的区别 💤 (以为掌握了但答得并不好!)
- 为什么需要对 axios 进行二次封装
- 虚拟滚动是如何实现的
- 项目中的防抖技术做了什么
- CSS 中 px,rem,em 分别是什么
- 水平垂直居中的实现方式
- position 有哪些属性, absolute 是相对于谁的
- 盒模型
- 隐藏一个元素的方式: display(回流) / visibility(重绘) / opacity(硬件加速)
- flex 布局设置元素间隙的方式
gap
- JavaScript 中判断数据类型的方法
- this 的指向???完全不知道怎么说,让我看代码讲还可以
- 改变 this 指向的方法 -> call 与 apply 的区别
- 箭头函数有 this 吗?
- 讲讲原型和原型链
- 讲讲 Event Loop
- script 标签会阻塞 DOM 的解析吗 -> 有什么方式可以解决这个问题
- 讲讲你对 Promise 的理解
- Promise 三种状态: pending / fulfilled / rejected
- 链式调用是如何实现的: then 方法返回的是一个新的 Promise 对象
- 数据类型的隐式转换
- 发生时机:算术运算符 / 比较运算符 / 逻辑运算符 / if 语句
- "1" + 1 的结果("11")
- "2" - 1 的结果(1)
看代码说结果:
const promise = new Promise((resolve, reject) => {
resolve("success1");
reject("error");
resolve("success2");
});
promise
.then((res) => {
console.log("then", res);
})
.catch((err) => {
console.log("catch", err);
});
// then success1
// Promise 状态改变后就不能再改变,虽然后面的代码还能继续执行.
var name = "World";
(function () {
if (typeof name === "undefined") {
var name = "Jack";
console.log("Goodbye " + name);
} else {
console.log("Hello " + name);
}
})();
// Goodbye Jack
// var 变量提升: 只提升定义不提升赋值,并且之提升到所在的作用域的顶部
function f1() {
console.time("time span");
}
function f2() {
console.timeEnd("time span");
}
setTimeout(f1, 100);
setTimeout(f2, 200);
function waitForMs(n) {
var now = Date.now();
while (Date.now() - now < n) {}
}
waitForMs(500);
// 在执行 setTimeout(f1, 100) 后会开启一个定时器,并在 100ms 后将 f1 放入宏任务队列, 但是回调函数 f1 并不会立即执行,而是等主线程空闲才会执行.
/**
* 上述代码的执行过程是:
* 1. 执行 setTimeout(f1, 100)
* 2. 执行 setTimeout(f2, 200)
* 3. 执行 waitForMs(500);
* 4. 由于 waitForMs(500) 会阻塞主线程 500ms, 此时 f1 与 f2 已经被放入宏任务队列中会被取出并且立即执行,所以 time span 实际上是执行带来的延迟而非定时器的延迟.
*/
二面
- 为什么选前端
- 职业规划,对前端的发展方向有了解吗?
- Github 活跃一般是在看哪些内容?
- 介绍一下项目中最有挑战的点
- 对这份工作有什么期待
- 有没有关注 AI 相关的内容
emmm,其实就是氛围很轻松的闲聊。
结束后 hr 约线下详谈。
冰智科技
投递渠道: BOSS 直聘
时间线
- 2024-02-16 打招呼投简历
- 2024-02-18 一面
- 2024-02-24 二面
一面
- 自我介绍与实习经历介绍
- Vue3 生命周期
- v-if 与 v-show 的区别
- 什么是虚拟 DOM
- useState 和 useEffect 如何使用
- React 中 state 与 props 有什么区别(通常 state 的改变由网络请求或者用户操作引起,props 由父组件传递)
- key 的作用
- 实习:如何进行项目规范搭建
- 实习:如何进行性能优化
- 项目:介绍一下项目中如何使用 rollup 的
- 手写代码:现场其一个 react 项目并实现一个 TodoList
二面
- 垂直居中的几种方式
- flex 布局的几个属性及其含义
- 0.1 + 0.2 为什么不等于 0.3
- 如何理解闭包, 闭包的使用场景
- 什么是宏任务和微任务
- 事件循环机制, 并看代码说结果
- cookie , LocalStorage, SessionStorage 的区别
- http 状态码
- 由 304 状态码引发浏览器缓存机制, 协商缓存与强缓存
- 哪些资源需要进行 CDN 加速
- React 中为什么 hooks 不能在条件语句中使用?
- useEffect 使用场景, dependencies 的作用, 返回值的作用
- React 父子组件通信的方式
- Vuex 的使用场景与基本原理
- Vuex 状态变更如何引起视图更新, 原理是什么
- 虚拟 DOM
- webpack 中的 loader 与 plugin 的区别
- sourceMap 的作用
- 打包方面的性能优化
- 最近做的项目中遇到的难点, 如何解决的
- 青训营项目
- 算法:二叉树的层序遍历
- 反问, 提升空间: 工程化与框架原理
新旦智能
投递渠道: BOSS 直聘
面试时间: 2024-02-19
- 自我介绍与实习经历
- 实习中的性能优化是如何做的
- 日常中遇到问题, 你会通过哪些渠道去解决
- 重绘与重排的区别
- Vue2 与 Vue3 的区别
- Vue 的响应式原理
- 如何理解响应式布局, 如何实现响应式的布局
- 原型与原型链的理解
- CDN 加速的概念与原理
- 对闭包的理解
- JavaScript 与 TypeScript 的区别
微软
投递渠道: 牛客网友内推
时间线
- 2024-02-21 一面
- 2024-02-26 二面
- 2024-02-27 三面
一面
- 自我介绍与实习经历
- 学业相关
- 算法:反转链表
- 算法:求一个数开方后的整数部分
二面
- 实习工作内容, 如何完善前端开发规范的
- for...in 与 for...of 的区别
- async/await 的理解
- 是否了解 AST ? 是否了解 ESLint 的原理
看代码说结果:
- 具名导入与默认导出
// utils.js
const sum = (a, b) => a + b;
export default sum;
export function minus(a, b) {
return a - b;
}
// index.js
import * as sum from "./utils";
// 如何调用相关函数
// sum.default(1, 2)
// sum.minus(1, 2)
- var / let / const 的变量提升
let 与 const 都存在变量提升, 提升到块级作用域顶部, 但同时也存在暂时性死区的概念
- 给函数的属性赋值是否会报错
function fn() {}
fn.name = "fn";
算法题:给定一个数字, 你可以将该数字中的任意一种数字替换为另一种数字, 例如你可以将该数中的所有 0 替换为 1. 你只能将一种数字替换为另一种数字, 请问通过该替换操作能得到的最大值与最小值之差为多少?
三面
- 自我介绍与实习经历
- 是否了解过性能优化, 有哪些方式
- 原生实现 tooltip
- CSS 如何绘制一个三角形
- 算法:手写堆排序
- 算法:lc 168. Excel 表列名称
哔哩哔哩
投递渠道: BOSS 直聘
时间线
- 2024-02-20 投递简历
- 2024-02-23 一面
- 2024-02-27 二面
一面
- 为什么离职
- 如何学习前端的
- TypeScript 常见的工具函数
- flex 布局常用属性
- 如何理解 Promise, 有哪些常见的方法
- 原型与原型链的理解
- npm 版本
^
与~
的区别: 前者兼容大版本, 后者兼容次版本 - npm 三位数版本号的含义: breaking change, feature, bug fix
- package-lock.json 的作用以及安装顺序: 如果与 package.json 冲突, 以 package.json 为准
- 跨域问题与解决方案
- rem 理解
- iframe 的作用与使用场景, 如何与父级通信, 如果遇到跨域问题如何解决
- 普通函数与箭头函数的区别, 箭头函数的 this 指向
- 对于闭包的理解
- 实习业务介绍
- 项目难点
- 项目中遇到的性能优化是如何做的
- 前端性能优化有哪些方向
- 竞态问题如何解决, 点击 TabA, 数据未返回又点击 TabB, 数据返回了, 如何保证数据的正确性
- 浏览器缓存
- 如何实现七天免登陆
二面
- 实习工作内容描述, 如何进行性能优化
- 怎么从 vue 转到 react 的?
- 介绍青训营项目
- 青训项目:npm 安装机制
- CSS:position 有哪些值, 分别代表什么意思, 分别相对于谁定位
- CSS: 如何实现一个正方形
- 手写代码, 原生实现一个点击 tab 切换的效果
- 事件委托与 react 中的事件机制
百度
部门:质量效能
投递渠道: BOSS 直聘
时间线
- 2024-02-27 一面
- 2024-02-27 二面
- 2024-03-06 三面
一面
- 实习经历业务介绍
- Vue 响应式原理, 开始吟唱 😎
- Vue 常见的指令
- V-if 与 V-show 的区别
- 输入 URL 到页面展示的过程
- 定义 CSS 的三种方式
- CSS 选择器与优先级
- get 请求与 post 请求的区别, 传参格式与传参位置有什么区别
- 跨域问题与解决方案
- 设计实现七天免密登录
- 算法:括号合法性判断
二面
- 为什么离职
- 输入 URL 到页面展示的过程(怎么又问一遍
- 手写代码,原生实现输入框输入时, p 标签中同步显示输入内容
- 用过哪些 Linux 命令
- 看代码说结果:
var i = 0;
for (i = 1; i <= 3; i++)
setTimeout(function () {
console.log(i);
}, 0);
// 4 4 4
// 解释: 先执行完 for 循环, i 的值变为 4, 然后再执行宏任务
- 什么是 XSS 攻击
- 如何理解 Promise, 有哪些常见的方法
三面
- 实习难点
- React 与 Vue 的区别
- 新项目技术选型, 可以从哪些维度考虑使用 React 或者 Vue
腾讯
投递渠道: 简历被捞
部门:QQ
时间线
- 2024-03-01 简历被捞,遂约面
- 2024-03-07 一面
- 2024-03-08 二面
- 2024-03-11 三面
一面
- 实习经历与难点介绍
- 实习过程中的依赖升级是如何做的
- npm 扁平安装机制如何处理版本冲突
- package-lock.json 的作用
- 类型体操:泛型函数
- 算法:LRU 缓存
- content-type 有哪些值, 分别代表什么?
二面
- 实习业务介绍
- React18 有哪些新特性(直接用的就是 18 版本,遂回答刷视频看到过的 React 19 的新特性)
- 常用的 hooks 有哪些
- React Fiber 架构了解吗
- Vue 组件通信方式
- props 与 emit
- provide 与 inject
- expose 与 ref
- 全局状态管理
- Vuex 实现原理
- 输入 URL 到页面展示的过程
- 解析 HTML 时遇见 script 标签如何处理,script 的 defer 与 async 的区别
- 了解过哪些性能优化方案
- Vue-router 的实现原理
- http1.0 / 1.1 / 2.0 的区别
- cookie 的作用与常见属性
- 开发中如何查看网络请求
- 项目开发中用过哪些 ts 特性
- 状态码 301/302/403 含义
- package.json 作用与常见字段含义
- package-lock.json 作用
- node 模块解析机制
- FPS 帧率的概念 ❌
- Vue 中如何定义一个组件(没搞懂这个问题的意思,只回答了 SFC
- 常用 Vue 指令
- Vue3 中的 setup 函数具有什么作用?
- 算法:大数减法
- Github 仓库中的 qq 机器人项目做了什么
- get 与 post 请求的区别
- https 的加密过程(TLS 四次握手)
- TSL 加密过程是比较消耗性能的,对于 QQ 这样的大型应用,有没有什么好的方案可以优化
- Web 安全:XSS 攻击与 SQL 注入
- Vue2 与 Vue3 响应式原理的区别
三面
- 实习过程中比较有技术含量的地方
- 做可视化有什么心得
- 项目深挖:字节青训 - 依赖分析工具
- 你这个工具与市面上同类产品比较有什么优势?这个优势是如何实现的?具体的技术细节?
- 单测覆盖率如何测量的?具体是如何编写单元测试的?
- Web UI 中具体布局是怎样的?展示了包的哪些信息?
- 具体是如何判断某个包在项目中存在版本冲突的?技术细节?如果一个包存在多版本冲突,在 Web UI 中如何展示?
- 自己开发过程中项目出现多版本冲突的情况是如何处理的?(引申到实习中处理依赖迁移时遇到的问题)
- 了解哪些性能优化手段
- 常见的应用层协议有哪些?传输层呢?
- (上一问衍生)SSE 的原理?
- HTTP 2 与 https 的关系
- QUIC 协议了解吗?
- 工具链: ESLint 与 Prettier 的应用场景,自己的项目中具体做过哪些配置?
- 心算题:5 点 15 分时针与分针的夹角 67.5°
- 平常有使用过 AI 吗?
经常在用,平常也写过小玩具,例如将 GPT 接入飞书机器人,实现自动回复。遂询问我对 GPT 的接口做了哪些拓展,讲了下如何实现上下文历史记忆,又问我这个做法与网络中的开源项目有什么区别。
- 是否有其他公司 offer 以及到岗时间
京东
投递渠道: 学姐内推
部门:CCO 体系
时间线
- 2024-03-15 一面
- 2024-03-20 上午 二面
- 2024-03-20 下午 三面
一面
- 实习业务与个人技术栈介绍
- 实习中印象深刻的点
- 可视化中是否有做过性能优化
- 如何学习前端知识的?对未来的规划是什么?
- flex 布局常见属性及其取值:justify-content / align-items / flex-direction / flex-wrap
- 场景:利用 flex 使得文本与 icon 水平垂直居中
- CSS 权重(最开始幻听成 CSS 全称了,哈哈哈太尴尬了)
- position 有哪些值,含义是什么
- 自己开发过程中在哪用到过媒体查询?(移动端适配与打印样式)
- js 数据类型有哪些?(基本数据类型与引用数据类型)
- 口头描述如何实现深拷贝
- 原型与原型链
- 递归实现从 1 加到 100
- 对于 Promise 的理解:解决回调地狱,链式调用,异步编程
- async/await 如何搭配 Promise 使用?(本身是一个语法糖,不同的编码风格)
- Vue2 与 Vue3 的区别(组合式 API 与响应式原理)
- 组件通信:props / emit / provide / inject / ref / vuex
- watch 与 computed 的区别
- 什么时候使用 interface 与 type
- git 拉取项目到提交 PR 的流程
- 如何进行版本回退
二面
- React 中如何实现样式隔离?(CSS Modules)
- JavaScript 操作 DOM 具有哪些 API?
- 创建 DOM :createElement
- 插入 DOM :appendChild / insertBefore
- 删除 DOM :removeChild
- 查找 DOM :getElementById / querySelector...
- 修改 DOM :innerHTML / innerText / textContent
- useCallBack 与 useMemo 的使用场景
- React 中父组件想要调用子组件的方法可以怎么做?
forwardRef & useImperativeHandle
- useEffect 使用场景。不传递第二个参数会怎么样?(会导致每次渲染都会执行)如何清理副作用?(返回一个清理函数)
- 常用的 TypeScript 类型有哪些?
- 对于 Promise 的理解
- 实现发布订阅模式
- 在构造函数中定义方法(或者属性)与在原型链上定义方法(或者属性)有什么区别?
- 了解哪些 CSS 单位
- npm 如何登陆注册表(
npm login --registry=xx
) - npm 发包流程:
- 本地测试:
npm link
- 更新版本号:
npm version major|minor|patch
- 发布包:
npm publish --access=public
- 本地测试:
- 平常是否有记录技术博客?
- 声明响应式变量的方式有哪些?
- watch 多个属性如何处理?深度监听如何处理?
- Vue 生命周期
三面
- 实习经历介绍?为什么离职?
- 实现响应式布局的几种方案
- 跨域问题与解决方案
- http 各种请求方式的作用与区别
- 口述实现防抖节流
- 设计一个简单的登录鉴权流程
- 手头上需求比较多并且可能无法按时交付的情况下怎么办?
- 在写某个需求时如果你觉得你的技术方案比较好,但是 mentor 与你意见不一致,你会怎么做?