一年经验面试字节抖音电商,分享下面经!
前言
大家好,我是林三心,用最通俗易懂的话讲最难的知识点是我的座右铭,基础是进阶的前提是我的初心,今天分享一个一年经验的字节抖音电商面经
一面
1、自我介绍?
略
2、问项目
略
3、leetcode第112题,《路径总和》
const hasPathSum = (root, sum) => {
if (root == null) { // 遍历到null节点
return false;
}
if (root.left == null && root.right == null) { // 遍历到叶子节点
return sum - root.val == 0;
// 如果满足这个就返回true。否则返回false
}
// 不是上面的情况,则拆成两个子树的问题,其中一个true了就行
return hasPathSum(root.left, sum - root.val) || hasPathSum(root.right, sum - root.val);
}
4、你知道哪些JS数组的API?
方法 | 作用 | 是否影响原数组 |
---|---|---|
push | 在数组后添加元素,返回长度 | ? |
pop | 删除数组最后一项,返回被删项 | ? |
shift | 删除数组第一项,返回被删项 | ? |
unshift | 数组开头添加元素,返回长度 | ? |
reserve | 反转数组,返回数组 | ? |
sort | 排序数组,返回数组 | ? |
splice | 截取数组,返回被截取部分 | ? |
join | 将数组变字符串,返回字符串 | ? |
concat | 连接数组 | ? |
map | 相同规则处理数组项,返回新数组 | ? |
forEach | 遍历数组 | ? |
filter | 过滤数组项,返回符合条件的数组 | ? |
every | 每一项符合规则才返回true | ? |
some | 只要有一项符合规则就返回true | ? |
reduce | 接受上一个return和数组下一项 | ? |
flat | 数组扁平化 | ? |
slice | 截取数组,返回被截取区间 | ? |
Array.prototype.sx_reduce = function (callback, ...args) {
let start = 0, pre
if (args.length) {
pre = args[0]
} else {
pre = this[0]
start = 1
}
for (let i = start;
i < this.length;
i++) {
pre = callback(pre, this[i], i, this)
}
return pre
}
6、讲一下HTTP缓存?
文章图片
7、谈谈vue和react的区别和优劣?
- vue2对ts支持较差,vue3时已解决
- vue2对jsx支持较差,vue3时已解决
- vue 和 react都是单向数据流
- vue多用模板 template,react多用 jsx
- vue和react都使用虚拟dom和diff算法
- vue是双向绑定,react是单向绑定
- vue和react都倡导组件化开发
- vue和react都支持服务端渲染
- vue2的状态管理工具vuex,vue3用pinia,react用redux、mobx、recoil
- vue的diff算法比react更高效
- react的写法更贴近js原生
我的React比较菜。。
- class组件:state和props都是固定的地址
- 函数式组件:state和props每次都会跟着渲染更新而更新
- 列表优化:懒加载、虚拟列表、分页
- 重绘回流:合并修改、requestAnimationFrame、will-change
- 提交优化:防抖
- 网络请求:控制并发量、取消重复请求、合并请求、http缓存
- webpack优化:代码压缩、gzip、CDN、代码分割、合理设置hash、图片转base64
略
二面 1、自我介绍?
略
2、项目中遇到最复杂的是什么?最有技术难度的是什么?
略
3、算法题
fn([['a', 'b'], ['n', 'm'], ['0', '1']])
=> ['an0', 'am0', 'an1', 'am1', 'bn0', 'bm0', 'bn1', 'bm0']
解答
const fn = (arr) => {
const length = arr.length
const res = []
const dfs = (items, str = '', index = 1) => {
if (index > length) {
res.push(str)
} else {
for (const item of items) {
dfs(arr[index], str + item, index + 1)
}
}
}
dfs(arr[0])return res
}
4、手写
u.console('breakfast').setTimeout(3000)
.console('lunch').setTimeout(3000)
.console('dinner')
【一年经验面试字节抖音电商,分享下面经!】解答
class U {
constructor() {
this.tasks = []
setTimeout(() => {
this.next()
})
}
next() {
const task = this.tasks.shift()
task && task()
}
console(str) {
const task = () => {
console.log(str)
this.next()
}
this.tasks.push(task)
return this
}
setTimeout(delay) {
const task = () => {
setTimeout(() => {
this.next()
}, delay)
}
this.tasks.push(task)
return this
}
}
5、事件代理是什么?
当子元素都需要绑定同样的事件的时候,这个时候可以把事件直接绑定在父元素上,并通过target对象来判断执行不同的子元素操作,这样可以大大减少绑定事件的数量,减少DOM操作,提高性能
6、e.target和e.currentTarget的区别?
e.target
:触发事件的元素e.currentTarget
:事件所绑定的元素
function proxy(event, cb, parent, child) {
parent[event] = function (e) {
if (parent.contains(child) &&
e.target === child) {
cb.call(this)
}
}
}
8、看代码说结果?
var length = 10;
function fn() {
return this.length + 1;
}
var obj1 = {
length: 5,
test1: function () {
return fn()
}
}
obj1.test2 = fn;
obj1.test1.call() // 1
obj1.test1() // 11
obj1.test2.call() // 11
obj1.test2() // 6
9、从输入Url到页面渲染发生了什么?写个提纲?
后面会单独出一篇文章
- 网络阶段:构建请求行、查询强缓存、DNS解析、建立TCP连接、发送HTTP请求、响应请求
- 解析阶段:解析html、构建dom树、计算样式、生成布局树
- 渲染阶段:生成图层树、生成绘制列表、生成图块、优先选择视口附近的图块生成位图数据、展示内容
- 1、基于连接与无连接
- 2、对系统资源的要求(TCP较多,UDP少)
- 3、UDP程序结构较简单
- 4、流模式与数据报模式
- 5、TCP保证数据正确性,UDP可能丢包
- 6、TCP保证数据顺序,UDP不保证
- 11、前端新技术了解哪些?说了PWA和electron,介绍了这两个主要是用来做什么?
- 新技术:微前端、低代码、Vue3、Vite
- PWA:不会
- Electron:使用JavaScript构建桌面端应用的框架
文章图片
推荐阅读
- 浏览器测评(一款免费、简单、神奇 超级浏览器丨想天浏览器)
- MQ面试问题整理
- C#|C# 给Word每一页设置不同图片水印
- etag|大一上学期+寒假(2019-9-7-2020-2-15) 心得与总结
- 十分钟学会C++|十分钟学会C++ Traits
- 每日一练(23)(第一个只出现一次的字符)
- php|php学习笔记——PHP 概述
- 数据结构与算法|算法——找出缺失的整数
- 区块链|以太坊智能合约开发 | 一个资深技术专家的心路历程
- python|分享一个开源免费、功能强大的视频播放器库