Я не думаю, что вы поняли, что предлагает immutablejs. Это не библиотека, которая просто превращает ваши объекты в неизменную, это библиотека, работающая с неизменяемыми значениями.
Без простого повторения их docs и mission statement, я сформулируем две вещи, которые она предоставляет:
Типы. Они внедрили (неизменяемые) бесконечные диапазоны, стопки, упорядоченные наборы, списки, ...
Все их типы реализованы как Persistent Data Structures.
Я солгал, вот цитата из их миссии:
Неизменных данные не могут быть изменены после создания, что приводит к гораздо более простой разработке приложений, не оборонительному копирования и позволяют передовые запоминания и изменениям обнаружения методы с простой логикой. Постоянные данные представляют собой мутативный API, который не обновляет данные на месте, но вместо этого всегда дает новые обновленные данные.
Я призываю вас читать статьи и видео, они ссылаются на и больше о стойких структурах данных (так как они в вещь immutablejs о), но я буду суммировать в предложении или так:
Предположим, вы пишете игру, и у вас есть игрок, который сидит на 2-м самолете. Вот, к примеру, Боб:
var player = {
name: 'Bob',
favouriteColor: 'moldy mustard',
x: 4,
y: 10
};
Поскольку вы пили FP Kool-Aid вы хотите, чтобы заморозить игрок (бррр надеется, Боб получил свитер!):
var player = Object.freeze({
name: 'Bob',
...
});
А теперь ввести свой игровой цикл , На каждом тике позиция игрока изменяется. Мы не можем просто обновить объект игрока, так как он заморожен, поэтому мы копируем его на:
function movePlayer(player, newX, newY) {
return Object.freeze(Object.assign({}, player, { x: newX, y: newY }));
}
Это хорошо и денди, но обратите внимание, насколько бесполезна копированием мы делаем: на каждый тик, мы создаем новые объект, перебираем один из наших объектов и затем присваиваем им некоторые новые значения. На каждом тике, на каждом из ваших объектов. Это довольно много.
Неизменные обручи это для вас:
var player = Immutable.Map({
name: 'Bob',
...
});
function movePlayer(player, newX, newY) {
return player.set('x', newX).set('y', newY);
}
И через ノ * ✧ ゚ магии ✧ ゚ * ヽ стойких структур данных, которые они обещают сделать количество операций возможных мере.
Существует также разница в менталитетах. При работе с «обычным старым [замороженным] javascript-объектом» действия по умолчанию со стороны все, что нужно сделать, должно предполагать изменчивость, и вам нужно выполнить дополнительную милю для достижения значимой неизменности (то есть неизменности, которая признает существование этого состояния). Это одна из причин, по которой существует freeze
: Когда вы пытаетесь сделать иначе, все паникует. Конечно, неизменяемость Immutablejs - это предположение по умолчанию, и на нем есть хороший API.
Это не значит, что все розовое и розовое с вишней сверху. Конечно, все имеет свои недостатки, и вы не должны переминать Неизменяемость везде, потому что вы можете. Иногда, только freeze
ing объект Достаточно Хорошо. Черт, большую часть времени это больше чем достаточно. Это полезная библиотека, которая имеет свою нишу, просто не увлекайтесь рекламой.
'Object.freeze()' отлично подходит для обертывания и обучения вашему мозгу концепцией неизменяемых состояний при использовании традиционных структур данных, но этот подход не принесет преимуществ производительности того, что приносит immutablejs. – Kujira
Object.freeze() не делает глубокое замораживание, вы можете использовать https://github.com/substack/deep-freeze для этого. Проблема в том, что обновление замерзающего объекта становится утомительным, особенно для вложенного объекта, например, Object.assign ({}, freezedObj, { a: 1, b: Object.assign ({}, freezedObj.b, {c : 2}) }); Вы можете проверить https://github.com/engineforce/ImmutableAssign, который является легким неизменным помощником, который может быть просто выше назначения. – engineforce