美文网首页JavaScript
字节跳动2020届春招前端面经【已拿offer】

字节跳动2020届春招前端面经【已拿offer】

作者: 格致匠心 | 来源:发表于2020-05-01 14:40 被阅读0次

    offer已拿,技术栈纯Vue,学历双非一本,无实习经历,考研失败。

    注意,纯Vue的技术栈不吃香,有比较大的概率会面到toB的部门。进大厂还是React+移动端开发经验好。

    一面:

    算法/语言特性/编程基础面。面试官会布置代码题给你,并且ta会出示一些题目,你需要写出答案。

    1. js基础 - 类型基础。
    typeof undefined
    typeof null
    typeof new String('foo')
    typeof (() => {})
    
    1. js基础 - 返回值和函数考察。
    var a = x => x;
    var b = x => {x;};
    var c = x => ({x});
    console.log(a(1));
    console.log(b(1));
    console.log(c(1));
    
    1. js基础 - const考察
    const a = {b: 1};
    a.b = 2;
    
    1. js基础 - var 和 函数作用域考察。
    // 3 3 3 3
    for (var i = 0; i < 3; i++) {
      setTimeout(() => {
        console.log(i);
      }, 1000);
    }
    

    附加问题:如何改动?

    // 使用包裹函数
    function func(n) {
            setTimeout(() => {
                console.log(n);
              }, 1000 * n);
        }
    
    for (var i = 0; i < 3; i++) {
        func(i)
    }
    // 使用let
    for (let i = 0; i < 3; i++) {
      setTimeout(() => {
        console.log(i);
      }, 1000 * i);
    }
    
    1. 实现任务队列。支持如下链式调用
    new Queue()
      .task(1000, () => {
        console.log(1);
      })
      .task(2000, () => {
        console.log(2);
      })
      .task(1000, () => {
        console.log(3);
      })
      .start();
    

    这个我之前的文章实现过async/await版本,其实用一个全局的变量也可以。面试官引导我写出全局变量版本。

    class Queue {
        construcotr() {
            this.arr = []
            this.time = 0
        }
        task(ms, f) {
            this.arr.push([ms, f])
            return this
        }
        start() {
            while(this.arr.length) {
                const [ms, f] = this.arr.shift()
                this.time += ms
                setTimeout(f, this.time)
            }
            this.time = 0
        }
    }
    
    1. this指针考察
    window.name = 'ByteDance';
    function Foo () {
      this.name = 'bar';
    }
    Foo.prototype.getName = function(){
      console.log(this);
      return this.name + 1;
    }
    let foo = new Foo();
    let getName = foo.getName;
    console.log(getName());
    console.log(foo.getName());
    console.log(getName.call(Foo));
    
    1. css问题 实现条纹表格,实现三角形
    2. 算法问题 爬楼梯 - 动态规划
      追问:空间复杂度优化改进
    假设你正在爬楼梯,需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶,你有多少种不同的方法可以爬到楼顶呢?
    
    /**
     * @param {number} n
     * @return {number}
     */
    function climb(n) {
    
    };
    
    climb(20)
    
    1. 闭包柯里化考察
    实现一个求和函数 sum
    1. 支持任意参数:sum(1), sum(1,2,3,4)
    2. 支持连续调用:sum(1)(2)(3)
       示例:
       const result = sum(1)(2,3)(4);
       console.log(result); // 输出 10
    3. 如果无法完成 result 直接打印可以简化如下:
       console.log(result.value()); // 输出 10
    
    function sum(...num) {
        let total = num.reduce((prev,curr)=>prev+curr,0)
        function add(...args) {
            total=args.reduce((prev,curr)=>prev+curr,total)
            return add
        }
        add.toString = () => total
        return add
    }
    

    二面

    开始问项目经验

    1. Vue依赖收集考察
    下面代码会不会触发实例更新
    var vm = new Vue({
      data: {
        test: 2,
        count:1
      },
       render(){
         return <div :click={()=>this.data.test=this.data.count+1}>{this.data.count}</div>
       }
    })
    
    1. this 指针考察
    window.name = 'ByteDance';
    function A () {
       this.name = 123;
    }
    A.prototype.getA = function(){
            console.log(this);
            return this.name + 1;
    }
    let a = new A();
    let funcA = a.getA;
    funcA();
    
    1. 算法 - 数组去重
    2. 算法 - 实现大整数相加
    3. 算法 - 实现trim

    三面

    聊天+项目经验询问

    1. Vue patch算法更新节点、删除节点、增加节点的具体操作
    2. 算法 - 判断回文数
    3. 算法 - 对称二叉树判断

    相关文章

      网友评论

        本文标题:字节跳动2020届春招前端面经【已拿offer】

        本文链接:https://www.haomeiwen.com/subject/rxdhvhtx.html