1、defer && async

  • 都并行加载,不阻塞html解析渲染
  • defer下载实现之后,待html解析实现之后,DOMContentLoaded之前(读取完</html>之前),依照程序执行
  • async下载完之后立刻执行,不能保障依照script标签程序执行
  • 如何抉择
    脚本之间有程序依赖时采纳defer,否则用async。理论生产中,第三方库打到vendor,pdd根底库打到common,页面打到一个js,是有程序依赖的,采纳defer。

2、原型的了解

  • 实例对象都存在隐式原型__proto__,函数办法存在原型对象prototype,函数作为构造函数来结构实例对象时,实例对象的__proto__会指向构造函数的prototype。
  • 读取对象属性和办法时,当本身不存在时会到prototype中去查找,实现原型对象属性和办法的继承。

3、作用域的了解 -> 变量、函数存储和读取的规定

  • 变量申明,编译器会在以后作用域申明一个变量,并为引擎生成运行时代码,便于引擎后续对该变量进行操作。
  • 作用域读取规定:引擎执行代码到对某一变量的操作时,会询问以后作用域中是否存在,存在则应用,否则到下层作用域查找,直到查找到为止,到全局作用域还未找到则抛错。

4、http协定
5、同源策略,跨域、跨站

  • 浏览器安全策略
  • access-control-allow-origin 通知浏览器哪个域容许;access-control-allow-credential 通知浏览器是否带上cookie

社招面筋一篇
1、typeof原理

  • js在底层存储变量的时候,会在变量的机器码的低位1-3位存储其类型信息,typeof就是通过机器码判断类型

2、浏览器缓存的地位及其区别

  • service worker cache 独立于js主线程之外,可自定义缓存规定
  • memory cache 存储、读取效率高、但空间限度,个别缓存一些小资源文件或内存利用较低时采纳,在过程完结时会开释
  • disk cache 存储空间大,读取效率绝对慢一些,不会开释
  • 1.对于大文件来说,大概率是不存储在内存中,反之优先 2.当零碎内存使用率高的时候,文件优先存到硬盘
  • http/2.0 push cache

3、xss与csrf

  • xss(https://tech.meituan.com/2018...)
  • 类型

    • 反射型 -> 将xss代码提交到一个变量,前端间接将变量插入到html;依赖用户输出,用户不输出恶意代码个别没问题,个别产生在搜寻框
    • 存储型 -> 攻击者在留言板将恶意代码提交到服务器,服务器长久存储,被攻击者拜访都会被注入攻打
    • dom型 -> 以后页面脚本批改dom树,在dom树中引入歹意xss。前端行为,不与服务器交互,服务端无奈进攻
  • 结构

    • script标签
    • a标签的javascript协定
    • img标签的加载谬误回调
  • 进攻

    • 输出过滤
    • 数据消毒【实体本义、黑白名单】
  • react底层对于xss的进攻
  • csrf

4、axios库了解

  • axios和Axios关系

    • axios是Axios.prototype.request绑定context返回的函数办法,将Axios原型对象上的办法和实例属性都挂到该函数上,性能上实现了Axios实例化;
  • instance和axios

    • axios.create创立出一个axios,和默认axios一样,既能够当函数,又能够当对象去应用
  • 执行流程

    • request -> dispatchRequest -> xhrAdapter
  • 申请响应拦截器
  • axios能够通过new Axios实列的模式应用,原理是什么?

    • axios是一个Axios原型对象中的request办法绑定一个实例对象的函数,并且将Axios类的所有实例属性和办法绑定到了该函数对象上,axios调用实质及调用了Axios类的实例办法,只不过扩大了应用,axios既能够当做函数也能够当做对象应用
    • 间接new一个Axios对象也能够通过对象调用申请办法,只不过不能作为函数应用

5、防抖 && 节流

  • 防抖(返回新的函数,该函数一段时间内不再触发则执行原函数,否则刷新定时器)
  • 节流(返回新的函数,该函数在一段时间内间断触发只执行第一次)

      // 防抖实现:  function debounce(fn, delay) {      var timer = null;      return function () {          if (timer) {              clearTimeout(timer);          }          timer = setTimeout(() => {              fn.apply(this, arguments);          }, delay)      }  }  // 节流 - 工夫戳实现  function throttle(fn, interval) {      var start = 0;      return function() {          if(Date.now() - start < interval) {              return;          }                    var result = fn.apply(this, arguments);          start = Date.now();          return result;      }  }  // 节流 - 定时器版本  function throttle(fn, interval) {      var timer = null;      return function() {          // 以后定时器不存在,从新触发时新起一个定时器          if (!timer) {              timer = setTimeout(() => {                  fn.apply(this, arguments);                  timer = null;              }, interval);          }      }  }

6、手写快排
7、手写event emitter

  • 实现思路:
    class EventEmitter {
    constructor() {

      this.eventBus = {};

    }

    subscribe(event, callback) {

      if(!this.eventBus[event]) {      this.eventBus[event] = [];  }  this.eventBus[event].push(callback);

    }

    emit(event, ...rest) {

      this.eventBus[event].forEach(cb => {      cb.apply(this, rest);  });

    }
    }

8、http/1.1 与 http/2.0的区别

  • http/0.9 申请行 仅反对get
  • http/1.0 http版本 申请/响应头 connection:keep-alive须要手动设置实现连贯复用
  • http/1.1 默认反对连贯复用,反对管道机制同时发送多个申请,但只能一一回应,存在“队头阻塞问题”,content-length,流传输transfer-encoding
  • http/2.0 多工通信(双向的、实时的通信)、数据流(响应ID,数据流id)、头信息压缩(压缩、索引表索引代替)、服务器推送