Immutable предназначен для переноса постоянных коллекций данных в Javascript. Созданный Facebook, он имеет открытый исходный код и только что достиг версии 3.0.0.
Immutable, вдохновленная функциональными языками программирования, представляет собой библиотеку JavaScript, которая создает данные, которые нельзя изменить после создания, что значительно упрощает разработку приложений, исключает защитное копирование и позволяет использовать передовые методы мемоизации.
Read.ME на Github объясняет как:
Многое из того, что затрудняет разработку приложений, — это отслеживание мутаций и поддержание состояния. Разработка с использованием неизменяемых данных побуждает по-другому думать о том, как данные проходят через ваше приложение.
и как:
Immutable предоставляет List, Stack, Map, OrderedMap и Set с использованием попыток постоянных хэш-карт и векторных попыток, популяризированных Clojure и Scala. Они достигают эффективности на современных виртуальных машинах JavaScript за счет использования структурного разделения и минимизации необходимости копировать или кэшировать данные.
Он также указывает на то, что эта модель потока данных хорошо согласуется с архитектурой React (еще одна инициатива Facebook, которая только что достигла версии 1.12) и особенно хорошо с приложением, разработанным с использованием идей Flux (также инициированного Facebook).
Immutable v3.0.0 представляет ряд новых концепций, переименованных методов и других критических изменений, которые, по словам Ли Байрона, были мотивированы тем, что:
Неизменяемый стремится быть идиоматическим JavaScript. Более того, он пытается отразить существующие связанные спецификации ES6. Он расширяет эти спецификации, пытаясь сохранить дух этих спецификаций.
Байрон также отмечает движение в сторону «нетерпеливых операций»:
Возможно, самым большим концептуальным изменением является то, что все операции сбора (фильтр, сопоставление, дубль, пропуск, срез и т. Д.) По умолчанию больше не являются ленивыми.
Он приводит в качестве примера, что в Immutable v2.x.x распространенным шаблоном является выполнение операции сбора с методом a.toXXX () для преобразования обратно в исходный тип.
// Неизменяемый v2
myMap.filter (somePredicate)
// Seq {…}
myMap.filter (somePredicate) .toMap ()
// Карта { … }
В Immutable v3 подобные операции теперь выполняются, явное преобразование больше не требуется.
// Неизменяемый v3
myMap.filter (somePredicate)
// Карта { … }
Он комментирует:
Ленивые операции по-прежнему возможны, и в случаях, когда одновременно используется более одного метода сбора или конечный результат должен быть другого типа, это может привести к повышению производительности за счет удаления промежуточных выделений.
Ленивая оценка теперь возможна только в том случае, если вы сделаете явное преобразование в тип Seq перед применением map, filer и т. Д., Что некоторые могут посчитать позором. Ленивое вычисление в Immutable в основном связано с производительностью, а не с семантикой, поскольку нет бесконечных коллекций.