ECMAScript 2023, обновление официальной спецификации языка программирования JavaScript, было одобрено ECMA International 27 июня со ссылкой на следующий краткий обзор улучшений:

ECMAScript 2023, 14-я редакция, представила методы toSorted, toReversed, with, findLast и findLastIndex для Array.prototype и TypedArray.prototype, а также метод toSpliced для Array.prototype; добавлена ​​поддержка #! comments в начале файлов для облегчения запуска исполняемых файлов ECMAScript; и разрешил использовать большинство символов в качестве ключей в слабых коллекциях.

Готовые предложения, опубликованные на GitHub, уточняют четыре функции, которые будут опубликованы в этом году:

1. Поиск массива из последнего:

Предложение для методов .findlast() и .findLastIndex() для массива и типизированного массива. Поиск элемента в массиве — очень распространенный шаблон программирования. Считается, что эти методы

  • Улучшить производительность
  • Избегайте очевидных накладных расходов
  • Это может быть полезно в некоторых сценариях, чувствительных к производительности, например: функция рендеринга React.

[...[]].reverse().find() — обходной путь, но есть две проблемы:

  1. ненужная мутация (обратным путем)
  2. ненужная копия (чтобы избежать мутации)

что приводит к третьей проблеме: сложный расчет индекса, взгляните на пример ниже.

const array = [3,10,32,45];

array.find(n => n % 5 === 0);
array.findIndex(n => n % 5 === 0);

// ======== Before the proposal =========== 

// find for the last value divisible by 5
[...array].reverse().find(n => n % 5 === 1);

// find index for the last value divisible by 5
array.length - 1 - [...array].reverse().findIndex(n => n % 5 === 0);

// find index for the last value equal to 45
array.length - 1 - [...array].reverse().findIndex(n => n === 45);

// ======== After the proposal ===========

// find for the last value divisible by 5
array.findLast(n => n % 5 === 0);

// find index for the last value divisible by 5
array.findLastIndex(n => n % 5 === 0);

// find index for the last value equal to 45
array.findLastIndex(n => n === 45); 

Следовательно, эти методы будут очень эффективными, когда разработчик знает, что требуемые значения лежат во второй половине массива.
Пример: массив является упорядоченным массивом, который может быть добавлен с помощью push или concat в очереди или стек, недавно совпавший момент времени на временной шкале и многое другое.

2. Разрешение символов в качестве ключей в ключах WeakMap:

Это предложение расширяет WeakMap API, позволяя использовать уникальные символы в качестве ключей. В настоящее время WeakMaps ограничены тем, что разрешают только объекты в качестве ключей, и это ограничение для WeakMaps, поскольку цель состоит в том, чтобы иметь уникальные значения, которые в конечном итоге могут быть объединены GC.

«Символ» — единственный примитивный тип в ECMAScript, допускающий уникальные значения. Значение символа — например, полученное при вызове выражения Symbol( [ description] ) — может быть идентифицировано только при наличии доступа к его исходному произведению. Любое воспроизведение одного и того же выражения с использованием того же значения для описания не восстановит исходное значение любого предыдущего произведения. Вот почему мы называем значения символов различными.

Объекты используются в качестве ключей для WeakMaps, потому что они имеют один и тот же аспект идентичности. Идентификация объекта может быть подтверждена только при доступе к исходному продукту, ни один новый объект не будет соответствовать ранее существовавшему — например, в — строгое сравнение.

Один из вариантов использования: Легко создавать ключи и делиться ими.

Вместо того, чтобы требовать создания нового объекта, который будет использоваться только в качестве ключа, символ обеспечит большую ясность для эргономики WeakMap и правильных ролей его ключей и сопоставленных элементов.

const weak = new WeakMap();
// Pun not intended: being a symbol makes it become a more symbolic key
const key = Symbol('my ref');
const someObject = { /* data data data */ };
weak.set(key, someObject);

3. Изменить массив копией:

Предложение предоставляет дополнительные методы для Array.prototype и TypedArray.prototype для включения изменений в массиве путем возврата его новой копии с изменением.

Это предложение вводит следующие свойства функции для Array.prototype:

  • Array.prototype.toReversed() -> Array
  • Array.prototype.toSorted(compareFn) -> Array
  • Array.prototype.toSpliced(start, deleteCount, ...items) -> Array
  • Array.prototype.with(index, value) -> Array

Все эти методы сохраняют целевой массив нетронутым и вместо этого возвращают его копию с выполненным изменением.

toReversed, toSorted и with также будут добавлены в TypedArrays.

Пример использования:

const sequence = [1, 2, 3];
sequence.toReversed(); // => [3, 2, 1]
sequence; // => [1, 2, 3]

const outOfOrder = new Uint8Array([3, 1, 2]);
outOfOrder.toSorted(); // => Uint8Array [1, 2, 3]
outOfOrder; // => Uint8Array [3, 1, 2]

const correctionNeeded = [1, 1, 3];
correctionNeeded.with(1, 2); // => [1, 2, 3]
correctionNeeded; // => [1, 1, 3]

Массивы не являются неизменяемыми по своей природе, этот стиль программирования может быть полезен, например, для пользователей, имеющих дело с замороженными массивами. Tuple.prototype вводит эти функции как способ работы с неизменным аспектом кортежей. Это предложение значительно упрощает написание кода, способного взаимозаменяемо работать с массивами и кортежами.

4. Хашбанг/Шебанг:

Это то, в чем я совсем не разбираюсь. Но предложение заключалось в том, что грамматика Hashbang гласит, что она должна соответствовать фактическому использованию Hashbang на некоторых хостах CLI JS, которые допускают Hashbangs/Shebangs. Эти хосты удаляют хэш-банг, чтобы генерировать действительные исходные тексты JS, прежде чем передавать их в механизмы JS. Этот план позволит перенести зачистку на двигатели, а также унифицировать и стандартизировать то, как это делается.

Подробнее о Hashbang/Shebang читайте в его Википедии для лучшего понимания.

Ну, это было с моей стороны. Дайте мне знать, что вы, ребята, думаете об этих предложениях в комментариях. Спасибо, что дочитали до конца!

Ссылки:

Поиск массива из последнего

Разрешение символов в качестве ключей в ключах WeakMap

Изменить массив копией

Грамматика Hashbang

Прочтите другие мои посты:





Все, что вам нужно знать об «Fetch API
Вводное руководство по Fetch API в JavaScriptjavascript.plainenglish.io»











Дополнительные материалы на PlainEnglish.io.

Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn, YouTube и Discord .