# 跳槽面试情况总结

# 富途

2020-12-11

  1. 浏览器输入url到渲染的一个过程
  2. 递归斐波那契数列
  3. 有效括号的算法题
  4. 实现两列布局
  5. 提交表单,数据结构如何实现

# 即构

  1. 变量提升,函数提升的题目

# 超级猩猩

  1. null == undefined结果是啥?,let a;a+10为啥
  2. 布局

img

img

img

# 小鹅通

  • 笔试
  1. this指向
  2. 闭包概念
  3. 变量提升
  4. xss防御
  5. 手写快速排序。
  6. 手写样式布局(两环)
  7. 输入域名到页面渲染的过程
  • 面试
  1. vue响应式原理
  2. vue视图更新原理
  3. vue对数组如何操作的
  4. 如何性能优化
  • 二面
  1. MVVM/MVC如何理解
  2. 说一下快排思路
  3. TCP/UDP差异
  4. 三次握手四次挥手

# blue

  • 笔试
  1. 未知宽高的容器水平垂直居中
  2. 向上箭头用css实现
  3. 说一下let/const的理解和var的差别
  4. 手写递归扁平化数组
  5. 网页输入url到渲染网页的过程
  6. js的基本数据类型有哪些
  7. vue组件通信的方法
  8. 对闭包的理解并举例
  9. promise的理解
  • 面试
  1. 箭头函数的理解,this 指向。
  2. 协商缓存,强缓存
  3. http https了解吗,三次握手四次挥手
  4. 强缓存和协商缓存如何通过webpack利用起来
  5. 如何实现一个footer sticky布局
  6. webpack分包
  7. vue响应式原理
  8. computed/watch区别
  9. 继承有几种方式,优缺点分别是什么。

# 牛客网

  1. 构造对象,对象里面有两个事件,利用事件队列实现执行完代码,on事件能执行输出结果

img

  1. 不利用防抖,如何避免请求触发多个
  2. v-model的原理

# 深信服

  • 电话面
  1. vue双向绑定原理(vue2.0 vue3.0)分别说说。
  2. v-if/v-show区别
  3. key的作用
  4. 数组去重能想到几种方法
  5. 时间复杂度如何理解
  6. 水平垂直居中有几种方法
  7. 箭头样式如何实现
  8. 伪类伪元素区别
  9. url输入到网页渲染的过程
  10. 闭包如何理解
  11. vue组件如何通信
  • 视频面
  1. 递归去除没有str属性的项(二叉树结构)
  2. v-modle原理了解吗
  3. computed了解吗?能计算哪些属性。
  4. 项目

# 极光推送

  • 电话面
  1. vm/vh rem的区别,rem的缺点,rem怎么计算
  2. vue的双向绑定的原理。view-modal,modal-view分别是怎样的
  3. vue模板编译
  4. 协商缓存强缓存,no-cache,no-store区别。为什么last-modified有了还要一个etag
  5. 如何判断一串dom字符串没有闭合标签的那个元素是什么
  6. 图像懒加载如何实现的
  7. webpack代理处理跨域有没有了解过,线上跨域了怎么解决。
  • 视频面
  1. 了解过什么状态码,204状态码了解吗
  2. https工作原理了解吗
  3. 手写了几题封装promise的场景设计题(忘了具体)

# 微众

  • 视频面
  1. 事件机制是怎样的,如果找到目标元素target
  2. 防抖节流的区别
  3. webpack使用过什么插件
  4. vue的双向绑定的原理
  5. 如何定位元素距离的矩形信息

# 明源云

  • 笔试
  1. 状态码有什么
  2. 移动端屏幕640px,要使得1rem=16px该怎么做
  3. 使用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
  1. 实现一个三栏布局,中间自适应并优先加载,左边宽100px排序,右边宽160px
  2. 函数传参,函数内改变参数。输出结果
  3. 如何改写a变量使得a==5&&a==8
  4. 画出vue生命周期
  5. 不使用forwhile循环,如何使一个长度为120的数组,各项值等于长度减去下标
var arr = new Array(120).fill(0)
arr1 = arr.map((item,index) => {
   return 120 - index
})
console.log(arr1)
1
2
3
4
5

img

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
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

# 商汤

  • 初试视频面
  1. https工作原理
  2. 说了一下浏览器缓存
  3. 一个三栏布局如何设计
  4. 手写一个reduce
  5. 项目经历

# shopee

# 卖家中心

  • 初试视频面
  1. grid布局用过什么属性,rem如何计算根元素字体大小
  2. vue双向绑定原理
  3. vue的mixin混入用过吗,有自定义过指令吗,bindinserted的区别
  4. 手写一个new
  5. 跨域有什么解决方案,cors一般怎么处理,jsonp的原理
  6. 深拷贝浅拷贝说一下,有什么影响。都有什么方案去解决。深拷贝的JSON.stringfy()有什么弊端,传入undefined或者函数时分别会怎样处理,遇到参数循环引用时要怎么停止循环。手写一个深拷贝(当传入参数类型有对象,数组,数字,字符串,布尔值,不用考虑复杂的情况)
  7. localStorage,sessionStorage,cookie的区别,cookie后端可以如何配置避免前端操作cookielocalStorage会被请求带过去吗?
  8. vuekey的一个作用
  9. 下面这个代码会发生什么。(就是一个暂时性死区)。有提到块级作用域。ES5则是一个函数和全局作用域
var a = 10
function test () {
    a = 5
    console.log(a)
    let a
}
test()
1
2
3
4
5
6
7
  1. 有效括号算法题
  2. display:nonevisibility: hidden区别
  3. js判断数据类型的方法
  4. vue2.0和vue3.0的一个双向绑定的差异。proxy性能上有什么提升
  5. vue组件通信的方案
  6. 如何使用vuex。
  7. vue-router的一个hashhistroy模式的差别。路由的实现原理
  8. eventloop题目
  • 复试视频面
  1. vue-router原理
  2. tree-shaking了解吗
  3. http请求优化
  4. option方法
  5. webpack性能优化
  6. 利用闭包&高阶函数进行函数缓存

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

也可以参考函数如何实现缓存 (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

# data 数据中心平台

  1. 前端安全的了解
  2. service-worker缓存
  3. 协商和强缓存
  4. promise的优缺点
  5. 手写一个promise
  6. 手写防抖节流
  7. 两个数组,项为整型。利用双指针求交集
  8. vue响应式原理,vue3.0性能优化方面

# 供应链

  • 一面
  1. 自我介绍/项目
  2. vue-router原理
  3. get/post请求区别,复杂请求options
  4. webpack性能优化的点
  5. es6使用过什么,箭头函数和普通函数的区别
  6. 事件循环/this指向/作用域修改变量的三道题目,然后一题场景设计题(说了思路)
  7. https/http的区别,在不安全的wifi项会怎么攻击
  8. 浏览器缓存的理解
  9. 页面渲染的关键路径,script标签的async/defer属性
  10. 重绘重排
  11. es module/commonjs模块化的区别
  12. 跨域的处理