Заметим, что ради производительности, мы не "зануляем" прочитанную ячейку массива, поэтому объект остается доступен в памяти и не может быть зачищен GC все то время, пока "хвост" не пройдет весь остальной массив и не перезапишет ячейку новым элементом.Иногда бывает необходимо "заглянуть" в следующий элемент очереди без его извлечения - поддержим обращение queue[0] по аналогии с обычным массивом. Для этого прямо в конструкторе объявим геттер для свойства .0
Object.defineProperty(this, 0, {
get : () => this._head < this._tail ? this._buffer[this._head] : undefined
});
Можно было бы поддержать доступ по произвольному индексу через Proxy так или так, но тогда через него пойдут и все обращения к локальным полям, что явно снизит производительность. undefinedи немного новых данных, которые нам нужны, и такой рост будет бесконечен.const tasks = []handle, которая в свою очередь работает рекурсивно и пока не дойдет до конца массива, будет выполнять каждую следующую задачу из него.undefinedв нем, после которых снова добавляются новые задачи.
card_id!это выражение говорит ТС, что мы жопу ставим на то, что мы точно не получимundefined?Как оно называется в ТС?