字节跳动前端面经(凉)

一面

还是太年轻,感觉自我介绍的时候把自己带跑了,回答的都不是很清晰,后面项目经历也写得不够好,下次努力啊!


  1. 自我介绍:你说前后端都写过,讲一讲前后端分离

  2. 讲下 MVCMVVM 的概念和区别

  3. 类型判断

    //es6方式,返回布尔值
    const isType1 = type => obj => Object.prototype.toString.call(obj) === `[object ${type}]`;
    let isArray = isType1('Array')
    isArray([1,2,3])
    // 第二种
    console.log([1,2,3] instanceof Array)
    // ...
    
  4. 项目=》 你的ajax封装了什么新功能,手写

  5. axios 拦截器,原理

      /*
      创建用于保存请求/响应拦截函数的数组
      数组的中间放发送请求的函数
      数组的左边放请求拦截器函数(成功/失败)
      数组的右边放响应拦截器函数
      */
      var chain = [dispatchRequest, undefined];
      var promise = Promise.resolve(config);
    
      // 后添加的请求拦截器保存在数组的前面
      this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {
        chain.unshift(interceptor.fulfilled, interceptor.rejected);
      });
      // 后添加的响应拦截器保存在数组的后面
      this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {
        chain.push(interceptor.fulfilled, interceptor.rejected);
      });
      
    
      // 通过promise的then()串连起所有的请求拦截器/请求方法/响应拦截器
      while (chain.length) {
        promise = promise.then(chain.shift(), chain.shift());
      }
    
      // 返回用来指定我们的onResolved和onRejected的promise
      return promise;
    
  6. promise实现队列,手写(真的紧张,影响心情)

    Promise.queue = function (things) {
            let len = things.length
            let results = new Array(len)
            return things.reduce((total, cur, index) => {
              //关键:使用then连接 和axios类似
                return total.then(
                (res) => {
                  return cur.then((res) => {
                    //console.log(res)
                    results[index] = res
                    if (results.length == len) {
                      return results // 返回结果
                    }
                  })
                },
                (reason) => {
                  return Promise.reject(reason)
                }
              )
            }, Promise.resolve())
          }
    
  7. 版本号排序,基数排序

    var version = ['1.23', '1.4', '2.5', '2.35', '6.2.3', '6.6.6']
    // 存储结果
    var nums = new Array(version.length)
    // 每个版本号转成数组
    for (let i = 0; i < nums.length; i++) {
      var maxDigit = 0
      nums[i] = version[i].split('.')
      if (nums[i].length > maxDigit) {
        maxDigit = nums[i].length
      }
      // console.log(nums[i])
    }
    //排序
    for (let i = maxDigit - 1; i >= 0; i--) {
      // 处理缺少的位,补零
      for (let index = 0; index < nums.length; index++) {
        if (i >= nums[index].length) {
          nums[index].push('0')
        }
      }
      // 按位排序
      nums.sort((a, b) => {
        return a[i] - b[i]
      })
    }
    // 处理成字符串
    for (let i = 0; i < nums.length; i++) {
      const regex = /,/gi
      let str = nums[i].toString().replace(regex, '.')
      nums[i] = str
    }
    // 输出 [ '1.4.0', '1.23.0', '2.5.0', '2.35.0', '6.2.3', '6.6.6' ]
    console.log(nums)
    
  8. document获取元素 (document.querySelector)

  9. vue 下使用标签元素

  10. 双向绑定 /草草结束


总结还是经验不够,面试的时候手写代码紧张,一顿操作猛如虎,一看战绩0-5的赶脚(笑哭)

posted @ 2020-07-09 11:48  Mikejiawei  阅读(111)  评论(0编辑  收藏  举报