• 字节跳动前端面经(凉)


    一面

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


    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的赶脚(笑哭)

  • 相关阅读:
    第15章-输入/输出 --- 字节流和字符流
    第15章-输入/输出 --- 理解Java的IO流
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
  • 原文地址:https://www.cnblogs.com/jiaweixie/p/13272817.html
Copyright © 2020-2023  润新知