Метод `at` для относительного индексации
Новый метод at
в Array.prototype
, различных TypedArray прототипах и String.prototype
упрощает доступ к элементу ближе к концу коллекции.
Доступ к N-му элементу с конца коллекции — это распространённая операция. Однако обычные способы выполнить её многословны, как my_array[my_array.length - N]
, или могут быть непродуктивными, как my_array.slice(-N)[0]
. Новый метод at
делает эту операцию более удобной, интерпретируя отрицательные индексы как «с конца». Примеры выше могут быть выражены как my_array.at(-N)
.
Для унификации также поддерживаются положительные индексы, и они эквивалентны обычному доступу к свойствам.
Этот новый метод достаточно мал, чтобы его полная семантика могла быть понята через приведённую ниже совместимую реализацию полифила:
function at(n) {
// Преобразование аргумента в целое число
n = Math.trunc(n) || 0;
// Разрешение отрицательной индексации с конца
if (n < 0) n += this.length;
// Доступ за пределами границ возвращает undefined
if (n < 0 || n >= this.length) return undefined;
// В противном случае это обычный доступ к свойствам
return this[n];
}
Несколько слов о строках
Поскольку at
в конечном счёте выполняет обычную индексацию, вызов at
на строках возвращает кодовые единицы, как и обычная индексация. И как обычная индексация строк, кодовые единицы могут не подходить для задачи с Unicode строками! Пожалуйста, подумайте, подходит ли String.prototype.codePointAt()
для вашего случая использования.