前端面试学习(2)

Vue双向数据绑定原理

采用“数据劫持”结合发布者-订阅者模式,通过Object.definedProperty()的setter和getter来劫持data的各个属性,当数据变化时,通知订阅者,来触发相应的监听回调。

Vue如何监听数组的变化

使用函数劫持的方式,重写了数组的方法 Vue 将 data 中的数组,进行了原型链重写。指向了自己定义的数组原型方法,这样当调用数组 api 时,可以通知依赖更新.如果数组中包含着引用类型。会对数组中的引用类型再次进行监控

Vuex

Vuex是Vue的状态管理模式,相当于一个共享仓库,其他页面可以访问这个仓库;

Vuex里面有五个属性:

State:存储数据;组件使用 store.state. 获取数据。

Getters: 获取数据,相当于state计算属性( computed ),通过this.$store.getters.获取。

Mutations: 唯一能修改store状态的方式,同步函数, this.$store.commit(方法名,值)。

Actions: 提交Mutations修改的数据,异步操作。

Module: 将 state 分成多个 modules,便于管理

axios拦截器

  • 请求拦截器:相当于一种请求检测机制,只有通过该检测的请求才能被发送。

  • 响应拦截器:相当于一种响应检测机制,只有通过该检测的响应才能被返回。

//通过axios请求拦截器
axios.interceptors.request.use(config=>{
//为请求头对象,添加token验证的Authorization字段
config.headers.Authorization = window.sessionStorage.getItem(‘token’)
return config
})
复制代码

js数据类型 判断引用数据类型

基本数据类型:Number、String、Boolean、Null、Undefined、Symbol(ES6新增)、BigInt(ES11新增);

引用数据类型:Function、Array、Object、Date、RegExp。

基本数据类型存在栈中,引用数据类型存在堆中,其指针存在栈中。

判断基本数据类型: typeof

判断数组:Array.isArray()

判断引用数据类型:

  • instanceof(左边必须是对象)

instanceof运算符用于检测构造函数的prototype属性是否出现在某个实例对象的原型链上

  • Object.prototype.toString.call()

继承

  • 借用构造函数:子类构造函数中使用call()或apply()

  • 原型链继承:父类的实例作为子类的原型

  • 组合继承:结合前两者的优点

  • 原型式继承:利用空对象为中间,将对象赋值给空对象构造函数的原型(浅复制)

  • 寄生式继承:使用原型式继承对一个目标对象进行浅复制,增强这个浅复制的能力

  • 寄生组合继承:结合借用构造函数传递参数和寄生模式实现继承

防抖、节流

防抖

任务频繁触发的情况下,只有任务触发的间隔超过指定间隔的时候,任务才会执行。

 // 防抖功能函数,接受传参
    function debounce(fn) {
      // 创建一个标记用来存放定时器的返回值
      let timeout = null;
      return function() {
        // 每次当用户点击/输入的时候,把前一个定时器清除
        clearTimeout(timeout);
        // 然后创建一个新的 setTimeout,保证点击按钮后的 interval 间隔内
        // 如果用户还点击了的话,就不会执行 fn 函数
        timeout = setTimeout(() => {
          fn.call(this, arguments);
        }, 1000);
      };
    }
复制代码

节流

指定时间间隔内只会执行一次任务。

    function throttle(fn) {
      // 通过闭包保存一个标记
      let canRun = true;
      return function() {
        // 在函数开头判断标志是否为 true,不为 true 则中断函数
        if(!canRun) {
          return;
        }
        // 将 canRun 设置为 false,防止执行之前再被执行
        canRun = false;
        // 定时器
        setTimeout( () => {
          fn.call(this, arguments);
          // 执行完事件(比如调用完接口)之后,重新将这个标志设置为 true
          canRun = true;
        }, 1000);
      };
    }
复制代码

重绘与回流

重绘(repaint)

当元素样式的改变不影响布局时,浏览器将使用重绘对元素进行更新,此时由于只需要 UI 层面的重新像素绘制,因此损耗较少。

常见的重绘操作有:

  • 改变元素颜色
  • 改变元素背景色

回流(reflow)

又叫重排(layout)。当元素的尺寸、结构或者触发某些属性时,浏览器会重新渲染页面,称为回流。此时,浏览器需要重新经过计算,计算后还需要重新页面布局,因此是较重的操作。

常见的回流操作有:

  • 页面初次渲染
  • 浏览器窗口大小改变
  • 元素尺寸/位置/内容发生改变
  • 元素字体大小变化
  • 添加或者删除可见的 DOM 元素

回流必定会触发重绘,重绘不一定会触发回流。重绘的开销较小,回流的代价较高。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享