2022-09-18大厂面经00
请注意,本文编写于 75 天前,最后修改于 75 天前,其中某些信息可能已经过时。

上海字节 Data 部门 广告部门

一面

  1. js 的基本数据类型

  2. null 和 undefined 的区别

  3. Number(null)Number(undefined) 输出啥

    0 和 NaN

  4. parseInt(undefined, 10) 输出啥

    NaN

  5. bigint 听过没

    BigInt 是一种内置对象,它提供了一种方法来表示大于 253 - 1 的整数。

  6. 数组去重的方法

  7. new Set().map 可以用吗

    不可以!!! Set 只有 has,add,delete,clear 方法以及 size 属性,可以使用 keys(),values(),entries(),forEach()

  8. const a = [1,2,3].map(k => console.log(k)) 的返回值是啥

    [undefined, undefined, undefined]

  9. vue 中 key 为什么不能用 index

  10. js 的事件执行机制

  11. 一段代码确定输出

    console.log('1');
    async function fun1() {
      console.log('2');
      await fun2();
      console.log('3');
    }
    async function fun2() {
      console.log('4');
    }
    
    process.nextTick(function () {
      console.log('5');
    });
    
    setTimeout(function () {
      console.log('6');
      process.nextTick(function () {
        console.log('7');
      });
      new Promise(function (resolve) {
        console.log('8');
        resolve();
      }).then(function () {
        console.log('9');
      });
    });
    
    fun1();
    
    new Promise(function (resolve) {
      console.log('10');
      resolve();
    }).then(function () {
      console.log('11');
    });
    console.log('12');
    
    // 答案是我的回答
    // 1
    // 2
    // 4
    // 10
    // 12
    // 5
    // 3
    // 11
    // 6
    // 8
    // 7
    // 9
  12. process.nextTick()是在这一轮的事件循环末执行还是在下一轮的事件循环初执行还是在两者之间执行

process.nextTick 这个名字有点误导,它是在本轮循环执行的,而且是所有异步任务里面最快执行的。
Node 执行完所有同步任务,接下来就会执行 process.nextTick 的任务队列。
  1. 手撕代码

    给定一个数组 const a = [-1,3,2,4,5,-6,7,-9];将这个数组正负数交叉排序,0 当做正数处理,返回[3,-1,2,-6,4,-9,5,7]

  2. 页面上有一个正方形的 div(红色),如何使得用户看不见它

    通过 css scale 缩放成 0(面试官想让我说这个,愣是想不到)

  3. 反问

    (1)业务 面向海外的创意,给广告主提供创意的
    (2)技术栈 react 公司自己开发的组件库
    (3)部门规模 不到150人 这个部门刚成立2个月

二面

  1. 业务

    这跟我的项目有关
    cpm是什么?(千次展示费用,即广告展示一千次需要支付的费用。...忘了)
    那你把你知道的说一说?次留率 消费成本 激活数 点击率
    那次留率,激活数是什么?
  2. 项目的难点

  3. vue data 中有一个数据 a: null,现在要监听 a 变化,但是只能变化一次.比如(null->1 行, 1->2 就不能变化了)

  4. 设计一个树形组件(可以展示层级的一个菜单)

    比如实现这样的菜单
    - 上海
     - 浦东
       - 张江
       - 唐镇
     - 长宁
     - 松江
    
    数据是类似这样的格式:
    treeData = [
      {
        name: '上海',
        level: 1,
        children: [
          {
            name: '浦东',
            level: 2,
            children: [
              {name: '张江', level: 3, children: null},
              {name: '唐镇', level: 3, children: null}
            ]
          },
          {name: '长宁', level: 2, children: null},
          {name: '松江', level: 2, children: null}
        ]
      }
    ]
    
    我的思路是写一个方法,递归调用给的数据,最后这个方法返回的是一个拼接好的模板字符串,放到template中
    
    面试官问这种方式行不行:(别问,问就是行!思路大概是递归调用组件)
    <tree :data=treeData/>
    
    <div>
      {tree.name}
      <tree :data=treeData.children v-if="Array.isArray(treeData.children)"/>
    </div>
  5. vue 的路由模式

  6. 前端你想走什么方向

  7. 代码题

    fs.readFile('/etc/passwd', (err, data) => {
      if (err) throw err;
      console.log(data);
    });
    
    
     // 实现一个promisify(fn)函数
    const readFile = promisify(fs.readFile)
    
    // 效果
    readFile('/etc/passwd').then((data) => {}, (err) => {})
    
    // 面试官提示
    promisify(fn)
    
    fn = (...args, (err, data) => {
    })
    
    // 实现promisify
    
    function promisify(fn) {
        return function () {
            let args = [...arguments];
            return new Promise((resolve, reject) => {
                fn(...args, (err, data) => {
                  if (err) reject(err);
                  resolve(data);
                })
            })
        }
    }
  8. 反问

    1. 作为开发人员也需要熟悉业务吗
    2. 部门前端这块儿大概有多少人
    3. 开发过程中有没有碰到 Mac/Window 滚动条不兼容的问题,咋处理的

三面

  1. 自我介绍
  2. 为什么不来字节实习
  3. 说一说你的强项是什么
  4. 手撕代码:无序数组找中位数
  5. 手撕代码:快排
  6. 快排的复杂度,什么时候复杂度是最差的
  7. Vuex 是干嘛的
  8. 在根组件里写要共享的数据,为什么不行呢
  9. 说说你最拿手的一个项目

四面

  1. 自我介绍

  2. 为什么没有继续实习

  3. 说一说你认为最有成果的项目

  4. 现在让你自己对自己提需求,你觉得项目还有哪些改进点

  5. 如何学习前端的,接下来准备学习什么

  6. 手撕代码:

    倒计时
    截止时间 2020年11月11日 0点
    显示“剩余XX天XX时XX分XX秒”
    每秒刷新一次
    let deadline = new Date('2020/11/11 00:00:00').getTime();
    window.setInterval(getDeadline, 1000);
    
    function getDeadline() {
      let cur = Date.now();
      let time = deadline - cur;
      let day = parseInt(time / 1000 / 3600 / 24);
      let hour = parseInt((time - day * 24 * 3600 * 1000) / 1000 / 3600);
      let min = parseInt((time - day * 24 * 3600 * 1000 - hour * 3600 * 1000) / 1000 / 60);
      let sec = parseInt((time - day * 24 * 3600 * 1000 - hour * 3600 * 1000 - min * 60 * 1000) / 1000);
      // 都显示成两位数 1 -> 01
      day = ('00' + day).slice(-2);
      hour = ('00' + hour).slice(-2);
      min = ('00' + min).slice(-2);
      sec = ('00' + sec).slice(-2);
      console.log(`剩余${day}${hour}${min}${sec}`);
    }
  7. 反问

    • 前端的技术栈迭代这么快,有什么值得推荐我了解或是学习一下的吗
    • 您来字节多久了?可以分享一下您的收获吗

HR 面

hr 面基本就是聊天了,只有七八分钟

  1. 整个四轮的技术面试体验
  2. 在哪些其他大厂的流程中
  3. 大概什么时候拿到毕业论文
  4. 如果给到校招 offer,最快什么时候能够提前来实习
  5. 反问

本文作者:前端小毛

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!