5.6 字节前端面试记录

522 阅读2分钟

5.6 字节飞书云表格前端

  • 自我介绍不充分,脑海中只能蹦出“技术栈关键词“,没有重要的信息可以供面试官参考。
  • 算法题只知其一不知其二,没能覆盖到最边缘情况和最优解。
  • 写算法题时,看我比较艰难,想提示下问了 Promise.resovel啥时候执行的问题,结果我没get到:(

算法题:

  • [1,[2,[3,[4,5]]]] 数组拍平,得到一维数组 (不适用额外的数组的话)

一下参考了 juejin.cn/post/684490…

    • 原生的:(竟然有原生的。。)

      [1,[2,[3,[4,5]]]].flat(Infinity) // Infinity 递归所有层级
      
    • reduce

      var flattenReduce = (arr) =>{
        return arr.reduce((preVal, val, i) => preVal.concat(Array.isArray(val) ? flattenReduce(val) : val), [])
      }
      
    • toString

      会破坏原本的类型

      var flattenUseToString = (arr)=>{
        return arr.toString().split(',').map(v=> Number(v));
      }
      
      
    • 今天看了MDN见识了两种写法:
// 无递归数组扁平化,使用堆栈
// 注意:深度的控制比较低效,因为需要检查每一个值的深度
// 也可能在 shift / unshift 上进行 w/o 反转,但是末端的数组 OPs 更快
var arr1 = [1,2,3,[1,2,3,4, [2,3,4]]];
function flatten(input) {
  const stack = [...input];
  const res = [];
  while (stack.length) {
    // 使用 pop 从 stack 中取出并移除值
    const next = stack.pop();
    if (Array.isArray(next)) {
      // 使用 push 送回内层数组中的元素,不会改动原始输入
      stack.push(...next);
    } else {
      res.push(next);
    }
  }
  // 反转恢复原数组的顺序
  return res.reverse();
}
flatten(arr1);// [1, 2, 3, 1, 2, 3, 4, 2, 3, 4]
// 使用 reduce、concat 和递归展开无限多层嵌套的数组
  var arr1 = [1,2,3,[1,2,3,4, [2,3,4]]];
function flatDeep(arr, d = 1) {
   return d > 0 ? arr.reduce((acc, val) => acc.concat(Array.isArray(val) ? flatDeep(val, d - 1) : val), [])
                : arr.slice();
};
flatDeep(arr1, Infinity);
// [1, 2, 3, 1, 2, 3, 4, 2, 3, 4]

  • 手写Promise.all 测试用例比较广

    Promise.myAll = list=>{
        return new Promise((resolve, reject) => { 
            let result = []
            let count = 0 ;
            list.forEach((p, i) => {
                // 可能会出现 非promise
                Promise.resolve(p).then(res=>{
                    result[i] = res;
                    console.log('res', res)
                    console.log('result', result, result.length)
                    console.log('count', count)
                    count++
                    if(count == list.length) resolve(result) // 不能拿 list.length === result.length 做结束条件,因为 length是根据最大值来的,有了2|3 就直接认定长度是2|3了.坑在这里了
                }).catch(reject)
            });
         })
    }
    
    Promise.myAll([1, Promise.resolve(2), Promise.reject(3)]).then(v => console.log(v)).catch(v => console.log(v)); // 3
    Promise.myAll(
        [new Promise((res) => setTimeout(() => res(1), 5000)),
             2, Promise.resolve(3),])
             .then(v => console.log(v)).catch(err=> console.log(err));  // [1, 2, 3]
    Promise.myAll([Promise.resolve(1), 2]).then(res=>{
        console.log(res)
    }) // [1, 2]
    

自我介绍改善

真想不到还有啥能说的了

  • 我是 xxx,今年xx,山西人,2019年来深圳就职于xxx。
  • 主要业务是做 xx,xx。
  • 主要前端技术栈是vue,nodejs相关的前端自用服务也经常去维护开发