【源码学习】第21期 | 长数组频繁shift和push? 是时候用yocto-queue 队列替代数组了!

79 阅读1分钟

前言

queue是什么

官方的推荐词是如果您在大数组上执行大量数组push和数组shift,则应使用此软件包,因为数组shift的线性时间复杂度为o(n)而队列的dequeue()具有恒定的时间复杂性o(1) 为什么说shift的时间复杂度为o(n),看一下shift的实现就知道了

Array.prototype._shift=function(){//在数组的原型链上自定义——shift方法
    var start=this[0]; //存储数组中第一个元素
    this[0]=null;//然后把数组中的第一个元素释放
    for(var i=0;i<this.length;i++){//数组元素做一个循环遍历
        this[i]=this[i+1];//数组中,元素的前一个元素跟后一个元素交换位置
    }
    this.length=this.length-1;//去除数组的最后一位元素
    return start;//返回数组中的第一个元素
}

源码下载

git clone https://github.com/sindresorhus/yocto-queue.git
cd yocto-queue
npm install

源码调试

入口文件index image.png

从源码中可以发现yocto-queue采用链表存储

image.png

export default class Queue { 
// 定义头部、尾部、节点数等私有变量     
    #head;
    #tail;
    #size;
    // 构造器,先清空数据
    constructor() {
    this.clear();
    }
    // ...删减代码稍候详细分析
    enqueue(value)
    dequeue()
    clear() 
    // 获取节点数
    get size() {
    return this.#size;
    }
    * [Symbol.iterator]()
   }