字节暑期实习前端二面

  1. 介绍项目

  2. 如何实现文件下载

    • 通过FileReader实例的readAsArrayBuffer方法,获取文件的二进制数据

    • 使用Blob这个构造函数创建一个blob实例,结合URL.createObjectURL方法创建一个包含源内容的字符串

    • 创建一个a标签,将a标签的href属性指定为URLL.createObjectURL方法返回的字符串,download指定为文件名称

    • 调用a标签的click方法实现文件下载

    • 例如

    • <!DOCTYPE html>
      <html lang="en">
      <head>
      <meta charset="UTF-8">
      <meta content="width=device-width, initial-scale=1.0" name="viewport">
      <meta content="ie=edge" http-equiv="X-UA-Compatible">
      <title>Title</title>
      </head>
      <body>
      <input id="file" name="img" type="file">
      </body>
      <script>
      const element = document.querySelector('#file');
      const fileReader = new FileReader()
      element.addEventListener('change', () => {
         // 获取文件对象
         let file = element.files[0]
         // 获取文件对应的二进制数据
         fileReader.readAsArrayBuffer(file)
         fileReader.onload = () => {
             // 创建blob实例
             let blob = new Blob([fileReader.result], {
                 type: file.type
             })
             // 创建包含源内容的字符串
             let url = URL.createObjectURL(blob)
             let a = document.createElement('a')
             a.href = url
             a.download = file.name
             // 下载文件
             a.click()
             // 删除这个包含源内容的字符串,因为该字符串与文档相关联,避免内存泄漏
             URL.revokeObjectURL(url)
         }
      })
      </script>
      </html>
      
      
      
  1. 使用URL.createObjectURL这个方法需要注意什么

    • 该方***创建一个字符串,其中包含一个表示参数中给出的对象的URL。这个 URL 的生命周期和创建它的窗口中的document相绑定

    • 需要调用URL.revokeObjectURL(url)从文档中移除该字符串,避免内存泄漏

  2. 服务器如何验证用户身份?

    • cookie或者token
  3. token过期了怎么办?

    • token续签
    • 已知token过期时间,在请求前根据时间差决定是否需要续签token
    • 或者当返回401状态码的时候,根据当前用户是否登录决定是否续签token,未登录重定向到登录页
  4. webpack如何配置压缩代码?

    • html----html-webpack-plugin
    • css----先提取css文件(mini-css-extract-plugin)---压缩css(css-minimizer-webpack-plugin)
    • js----terser-webpack-plugin
    • compression-webpack-plugin将文件压缩为gzip格式,在浏览器请求压缩后的.gz文件时,会通过浏览器内置的解码器解码.gz文件
    • 配置tree-shaking删除无用代码,也可以压缩代码体积
  5. 使用tree-shaking需要注意什么?

    • 项目的模块规范必须使用esmodule
    • package.json中的sideEffects设置为false,表示整个项目没有副作用,可以进行tree-shaking处理
    • 如果css文件通过@import引入的其他的css文件,说明该样式文件存在副作用,需要在sideEffects配置一个数组,值为对应的css文件名称
  6. webpack压缩时,主要压缩了什么?

    • 删除代码之间的空格
    • 删除注释
    • 减少变量名和函数名的长度,让变量名和函数名更短,打包出来变量名或者函数名基本只有一两个字母
  7. 将图片转换为base64编码和不转换有啥区别吗?

    • 好处就是,将图片转换为base64字符串,让图片可以通过内联的方式被引入,减少了网络请求的带宽消耗
    • 缺点就是内容编码后体积变大,编码和解码需要额外的开销
  8. base64如何编码,为啥非要叫base64,不叫63?

    • 我。。。(凉)
    • 早期文件传输使用的ascll编码,对于图片,视频等文件处理不好,为解决这个问题base64编码应运而生
    • base64有一张数值与字符的对应表,数字从0-63,每个数字对应一个字符
    • 这些字符包括a-z A-Z 0-9 + / 一共64个,所以叫base64
  9. 除了base64,图片还可以转换为那种形式的编码,然后直接引入?

    • 我的乖乖,不晓得(哦豁)
  10. gzip如何编码?

    • 啊这。。。。(寄)
    • 将文件打包成二进制数据,在http协议的两端,比如浏览器和服务器,通过内置的编码器和解码器进行数据传输吧
  11. 实现es6的Set

    • class MySet {
        constructor() {
          this.size = 0;
          this.list = {};
        }
      
        add(val) {
          if (!this.list[val]) {
            this.list[val] = val;
            this.size++;
            return true;
          }
          return false;
        }
      
        has(val) {
          return this.list.hasOwnProperty(val);
        }
      
        delete(val) {
          if (this.list[val]) {
            delete this.list[val];
            this.size--;
            return true;
          }
          return false;
        }
      
        clear() {
          this.list = {};
          this.size = 0;
        }
      
        keys() {
          return Object.keys(this.list);
        }
      
        values() {
          return Object.values(this.list);
        }
      
        entries() {
          return Object.entries(this.list);
        }
      
        forEach(callback) {
          let keys = this.keys();
          for (let i = 0; i < keys.length; i++) {
            callback(keys[i], keys[i], this.list);
          }
        }
      }
      
  1. 实现哈希表

    • class Hash {
        constructor() {
          this.map = [];
          this.size = 0;
          this.max = 64;
        }
      
        getHash(key) {
          let code = 0;
          for (let i = 0; i < key.length; i++) {
            code += key.charCodeAt(i);
          }
          return code % this.max;
        }
      
        set(key, val) {
          if (this.size >= this.max) {
            return false;
          }
          let index = this.getHash(key);
          while (this.map[index]) {
            index = (index + 1) % this.max;
          }
          this.map[index] = val;
          this.size++;
        }
      
        has(key) {
          return !!this.map[this.getHash(key)];
        }
      
        get(key) {
          return this.map[this.getHash(key)];
        }
      
        delete(key) {
          if (this.has(key)) {
            this.map[this.getHash(key)] = undefined;
            this.size--;
          }
        }
      
        clear() {
          this.map = [];
          this.size = 0;
        }
      }
#字节跳动##实习##春招##前端#
全部评论
好难
1 回复 分享
发布于 2022-03-31 18:12
woc 问得好难。。大佬水平好高
1 回复 分享
发布于 2022-03-31 20:06
这是啥题阿………
1 回复 分享
发布于 2022-04-01 03:52
学到了,楼主实现es6实现Set没考虑对象的键只能是字符串的问题,还有forEach()方法,第三个参数是mySet本身,这里改进了下楼主的代码: class mySet { constructor(optionsArr = []){   if(!(optionsArr instanceof Array)) throw Error('参数只能为数组&(16951)#39;)    this.list = {}   this.size = optionsArr.length   optionsArr.forEach(val => {     this.list[val] = val   }) } add(val){ if(!this.list[val]) { this.list[val] = val this.size++ return true } return false } has(val){ if(val !== null &&typeof val === 'object&(10249)#39;) return false return this.list.hasOwnProperty(val) } delete(val){ if(this.list[val]) { delete this.list[val] this.size-- return true } return false }      clear(){ this.list = {} this.size = 0 } keys(){ return Object.values(this.list) }      values(){         return Object.values(this.list) } entries(){    return Object.entries(this.list).map(item => {             item[0] = item[1]             return item         }) } forEach(callback){ let keys = this.keys() for(let i = 0;i<keys.length;i++) { callback(keys[i],keys[i],this) } } }
1 回复 分享
发布于 2022-04-04 15:55
太牛了
点赞 回复 分享
发布于 2022-04-01 01:49
强啊!
点赞 回复 分享
发布于 2022-04-05 00:40
天哪好难
点赞 回复 分享
发布于 2022-04-06 08:56
这题我一脸懵逼
点赞 回复 分享
发布于 2022-04-12 15:49

相关推荐

点赞 评论 收藏
分享
14 81 评论
分享
牛客网
牛客企业服务