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()
— обходной путь, но есть две проблемы:
- ненужная мутация (обратным путем)
- ненужная копия (чтобы избежать мутации)
что приводит к третьей проблеме: сложный расчет индекса, взгляните на пример ниже.
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 читайте в его Википедии для лучшего понимания.
Ну, это было с моей стороны. Дайте мне знать, что вы, ребята, думаете об этих предложениях в комментариях. Спасибо, что дочитали до конца!
Ссылки:
Прочтите другие мои посты:
Все, что вам нужно знать об «Fetch API
Вводное руководство по Fetch API в JavaScriptjavascript.plainenglish.io»
Дополнительные материалы на PlainEnglish.io.
Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn, YouTube и Discord .