Записи и кортежи в JS
Записи и кортежи - это новые неизменяемые типы данных JavaScript, которые в настоящее время находятся на этапе 2 процесса утверждения стандартов TC39. Они могут быть изменены и в настоящее время недоступны ни в одном браузере или во время выполнения, но рабочие реализации должны появиться в течение следующего года. Они помогают решить пару запутанных головоломок, с которыми сталкиваются программисты…
Постоянные изменения
Профессиональные JS разработчики скажут тебе, что назначение переменных с помощью const
является наилучшей практикой там, где это возможно. Это делает переменные неизменными. Значения нельзя изменить, поэтому у тебя будет меньше проблем.
К сожалению, const
делает неизменными только примитивные значения (String, Number, BigInt, Boolean, Symbol и undefined
). Ты не можешь переназначить массив или объект, но значения и свойства, которые они содержат, можно изменить. Например:
Аналогично для объектов:
Метод Object.freeze()
может помочь, но только поверхностное замораживание применяется к непосредственным дочерним свойствам объекта:
Поэтому трудно гарантировать, что функция не изменит намеренно или случайно значения, хранящиеся в массиве или объекте. Разработчики должны либо надеяться на лучшее, либо передавать клонированную версию переменной (что имеет свои проблемы).
Эквивалентное неравенство
Дальнейший хаос может возникнуть, когда разработчики попытаются произвести кажущиеся разумными сравнения объектов или массивов:
По значению можно сравнивать только примитивные типы. Объекты и массивы передаются и сравниваются по ссылке. Две переменные будут эквивалентны, только если они указывают на один и тот же элемент в памяти:
Для глубокого сравнения двух объектов или массивов требуется функция рекурсивного сравнения для оценки каждого значения по очереди. Даже в этом случае ты можешь столкнуться с проблемами с такими типами, как даты или функции, которые могут храниться по-разному.
Кортежи: неизменяемые структуры данных, подобные массивам
Кортежи - это глубоко неизменяемые структуры данных, подобные массивам. По сути, это составные примитивные типы, идентифицируемые модификатором #
перед синтаксисом нормального массива:
В качестве альтернативы новый метод Tuple.from()
может создать кортеж из массива:
В отличие от стандартных массивов, кортежи должны удовлетворять следующим требованиям:
- В них не должно быть holes с неустановленными значениями. Например,
#[1 ,,, 4]
недействителен. - Они должны устанавливать только примитивы, другие кортежи или записи. Типы, такие как массивы, объекты или функции, не разрешены:
Поскольку кортежи являются примитивами, их можно глубоко сравнить по значению с другими кортежами:
Обрати внимание, что сравнения с использованием менее строгого оператора ==
возможны, если кортеж содержит одно значение. Например:
Записи: неизменяемые объектные структуры данных
Записи - это глубоко неизменяемые объектные структуры данных. Опять же, это составные примитивные типы, идентифицируемые модификатором #
перед синтаксисом обычного объекта:
В качестве альтернативы конструктор new Record()
может создать запись из объекта:
Или метод Record.fromEntries()
может создать запись из серии пар значений массива или кортежа:
В отличие от стандартных объектов, записи должны соответствовать следующим требованиям:
Они должны использовать строковые имена свойств. Например, #{Symbol(): 1}
недействителен. Они должны устанавливать значения только с помощью примитивов, других кортежей или записей. Типы, такие как массивы, объекты или функции, не разрешены:
Записи можно глубоко сравнивать с другими записями, и порядок свойств не имеет значения:
Записи можно сравнивать только с другими записями, поэтому использование оператора ==
или ===
не имеет значения. Однако можно извлечь keys()
и values()
объекта для конкретных сравнений. Например:
Постоянные обновления
Кортежи и записи могут звучать как сложные термины информатики, но они, наконец, дадут надежное неизменяемое хранение и сравнение данных в JavaScript. Ты можешь опробовать их сегодня на этой площадке или с этим полифиллом, но имей в виду, что предлагаемая реализация может измениться в ближайшие месяцы.
Источник: https://www.sitepoint.com/records-tuples-javascript-immutable-data-types/