# 跳槽面试情况总结
# 富途
2020-12-11
- 浏览器输入
url
到渲染的一个过程 - 递归斐波那契数列
- 有效括号的算法题
- 实现两列布局
- 提交表单,数据结构如何实现
# 即构
- 变量提升,函数提升的题目
# 超级猩猩
null == undefined
结果是啥?,let a;a+10
为啥- 布局
# 小鹅通
- 笔试
this
指向- 闭包概念
- 变量提升
xss
防御- 手写快速排序。
- 手写样式布局(两环)
- 输入域名到页面渲染的过程
- 面试
- vue响应式原理
- vue视图更新原理
- vue对数组如何操作的
- 如何性能优化
- 二面
MVVM/MVC
如何理解- 说一下快排思路
TCP/UDP
差异- 三次握手四次挥手
# blue
- 笔试
- 未知宽高的容器水平垂直居中
- 向上箭头用
css
实现 - 说一下
let/const
的理解和var
的差别 - 手写递归扁平化数组
- 网页输入
url
到渲染网页的过程 - js的基本数据类型有哪些
- vue组件通信的方法
- 对闭包的理解并举例
- 对
promise
的理解
- 面试
- 箭头函数的理解,
this
指向。 - 协商缓存,强缓存
http https
了解吗,三次握手四次挥手- 强缓存和协商缓存如何通过
webpack
利用起来 - 如何实现一个
footer sticky
布局 webpack
分包vue
响应式原理computed/watch
区别- 继承有几种方式,优缺点分别是什么。
# 牛客网
- 构造对象,对象里面有两个事件,利用事件队列实现执行完代码,
on
事件能执行输出结果
- 不利用防抖,如何避免请求触发多个
v-model
的原理
# 深信服
- 电话面
vue
双向绑定原理(vue2.0 vue3.0)
分别说说。v-if/v-show
区别key
的作用- 数组去重能想到几种方法
- 时间复杂度如何理解
- 水平垂直居中有几种方法
- 箭头样式如何实现
- 伪类伪元素区别
url
输入到网页渲染的过程- 闭包如何理解
vue
组件如何通信
- 视频面
- 递归去除没有
str
属性的项(二叉树结构) v-modle
原理了解吗computed
了解吗?能计算哪些属性。- 项目
# 极光推送
- 电话面
vm/vh rem
的区别,rem
的缺点,rem
怎么计算vue
的双向绑定的原理。view-modal,modal-view
分别是怎样的vue
模板编译- 协商缓存强缓存,
no-cache,no-store
区别。为什么last-modified
有了还要一个etag
- 如何判断一串
dom
字符串没有闭合标签的那个元素是什么 - 图像懒加载如何实现的
webpack
代理处理跨域有没有了解过,线上跨域了怎么解决。
- 视频面
- 了解过什么状态码,
204
状态码了解吗 https
工作原理了解吗- 手写了几题封装promise的场景设计题(忘了具体)
# 微众
- 视频面
- 事件机制是怎样的,如果找到目标元素
target
- 防抖节流的区别
- webpack使用过什么插件
- vue的双向绑定的原理
- 如何定位元素距离的矩形信息
# 明源云
- 笔试
- 状态码有什么
- 移动端屏幕
640px
,要使得1rem=16px
该怎么做 - 使用
css
画梯形
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Document</title>
<style type="text/css">
.trapezoid{
border-bottom: 100px solid red;
border-left: 50px solid transparent;
border-right: 50px solid transparent;
width: 100px;
height: 100px;
}
</style>
</head>
<body>
<div class="trapezoid"></div>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- 实现一个三栏布局,中间自适应并优先加载,左边宽
100px
排序,右边宽160px
- 函数传参,函数内改变参数。输出结果
- 如何改写
a
变量使得a==5&&a==8
- 画出vue生命周期
- 不使用
for
或while
循环,如何使一个长度为120
的数组,各项值等于长度减去下标
var arr = new Array(120).fill(0)
arr1 = arr.map((item,index) => {
return 120 - index
})
console.log(arr1)
1
2
3
4
5
2
3
4
5
let data = [
{ 'parent_id': null, 'id': 'a', 'value': 'xxx' },
{ 'parent_id': 'a', 'id': 'c', 'value': 'xxx' },
{ 'parent_id': 'd', 'id': 'f', 'value': 'xxx' },
{ 'parent_id': 'c', 'id': 'e', 'value': 'xxx' },
{ 'parent_id': 'b', 'id': 'd', 'value': 'xxx' },
{ 'parent_id': 'a', 'id': 'b', 'value': 'xxx' },
]
function tranArrToObj() {
let obj = {}
// 找出根节点
let root = data.find(v => v.parent_id === null)
// 构建根节点结构
obj[root.id] = {}
let insertObj = (pData, sData) => {
let parentKey = sData.parent_id
let key = sData.id
// 找到当前 子节点下所有节点
let childrenNode = data.filter(v => v.parent_id === sData.id)
if (childrenNode.length === 0) return
childrenNode.map(v => {
// 构建数据结构
if (!pData.children) {
pData.children = {}
}
pData['children'][v.id] = {}
// 递归找下一级节点
insertObj(pData['children'][v.id], v)
})
}
insertObj(obj[root.id], root)
return obj
}
tranArrToObj()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
function test(a,b) {
console.log(b)
return {
test: function(c,a) {
return test(c,a)
}
}
}
var a = test(100,200) // 200
a.test(300) // undefined
a.test(400) // undefined
var b = test(101).test(201).test(401) // undefined undefined undefined
var c = test(102).test(202,302);
c.test()
// undefined 302 undefined
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 商汤
- 初试视频面
- https工作原理
- 说了一下浏览器缓存
- 一个三栏布局如何设计
- 手写一个reduce
- 项目经历
# shopee
# 卖家中心
- 初试视频面
- grid布局用过什么属性,rem如何计算根元素字体大小
- vue双向绑定原理
- vue的mixin混入用过吗,有自定义过指令吗,
bind
和inserted
的区别 - 手写一个
new
- 跨域有什么解决方案,
cors
一般怎么处理,jsonp
的原理 - 深拷贝浅拷贝说一下,有什么影响。都有什么方案去解决。深拷贝的
JSON.stringfy()
有什么弊端,传入undefined
或者函数时分别会怎样处理,遇到参数循环引用时要怎么停止循环。手写一个深拷贝(当传入参数类型有对象,数组,数字,字符串,布尔值,不用考虑复杂的情况) - localStorage,sessionStorage,cookie的区别,cookie后端可以如何配置避免前端操作
cookie
。localStorage
会被请求带过去吗? vue
的key
的一个作用- 下面这个代码会发生什么。(就是一个暂时性死区)。有提到块级作用域。ES5则是一个函数和全局作用域
var a = 10
function test () {
a = 5
console.log(a)
let a
}
test()
1
2
3
4
5
6
7
2
3
4
5
6
7
- 有效括号算法题
display:none
和visibility: hidden
区别- js判断数据类型的方法
- vue2.0和vue3.0的一个双向绑定的差异。
proxy
性能上有什么提升 - vue组件通信的方案
- 如何使用vuex。
vue-router
的一个hash
和histroy
模式的差别。路由的实现原理eventloop
题目
- 复试视频面
- vue-router原理
- tree-shaking了解吗
- http请求优化
option
方法- webpack性能优化
- 利用闭包&高阶函数进行函数缓存
f1('abc', 123, {b:3}); // 10, 1000s
f1('abc', 123, {b:3}); // 10, 1000s
function cache(f) {
let objCache = {}
return function () {
let curArgs = ''
// 这里使用深复制会好点
for (let i = 0; i < arguments.length; i++) {
if (Array.isArray(arguments[i])) {
curArgs += arguments[i].join(',')
} else if (typeof arguments[i] === 'object') {
curArgs += JSON.stringify(arguments[i])
} else {
curArgs += arguments[i]
}
}
// curArgs
if (curArgs) {
return objCache[curArgs]
} else {
objCache[curArgs] = f(curArgs)
return objCache[curArgs]
}
}
}
f2 = cache(f1);
f2('abc', 123, {b:3}); // 10, 1000s
f2('abc', 123, {b:3}); // 10, 0s
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
也可以参考函数如何实现缓存 (opens new window)
const memorize = function(fn) {
const cache = {} // 存储缓存数据的对象
return function(...args) { // 这里用到数组的扩展运算符
const _args = JSON.stringify(args) // 将参数作为cache的key
return cache[_args] || (cache[_args] = fn.apply(fn, args)) // 如果已经缓存过,直接取值。否则重新计算并且缓存
}
}
const add = function(a, b) {
console.log('开始缓存')
return a + b
}
const adder = memorize(add)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# data 数据中心平台
- 前端安全的了解
- service-worker缓存
- 协商和强缓存
- promise的优缺点
- 手写一个promise
- 手写防抖节流
- 两个数组,项为整型。利用双指针求交集
- vue响应式原理,vue3.0性能优化方面
# 供应链
- 一面
- 自我介绍/项目
- vue-router原理
- get/post请求区别,复杂请求options
- webpack性能优化的点
- es6使用过什么,箭头函数和普通函数的区别
- 事件循环/this指向/作用域修改变量的三道题目,然后一题场景设计题(说了思路)
- https/http的区别,在不安全的wifi项会怎么攻击
- 浏览器缓存的理解
- 页面渲染的关键路径,script标签的async/defer属性
- 重绘重排
- es module/commonjs模块化的区别
- 跨域的处理
← 🦐皮项目总结