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


    一面

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


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

  • 相关阅读:
    C++指针详解
    C++中#include包含头文件带 .h 和不带 .h 的区别
    #if的使用说明
    非常简单的语音朗读功能
    C#基础笔记(第十一天)
    C#基础笔记(第十天)
    手机管理系统
    编程书籍大集合
    centos 安装多实例数据库
    Python3 网络爬虫(请求库的安装)
  • 原文地址:https://www.cnblogs.com/jiaweixie/p/13272817.html
Copyright © 2020-2023  润新知