JavaScript

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

2020-05-01  本文已影响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. 算法 - 对称二叉树判断
上一篇下一篇

猜你喜欢

热点阅读