Заметим, что ради производительности, мы не "зануляем" прочитанную ячейку массива, поэтому объект остается доступен в памяти и не может быть зачищен 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
?Как оно называется в ТС?