Изменяемый объект
В JavaScript объекты являются данными о эталонном типе. Преимущество заключается в том, что когда объекты часто изменяются, они изменяются на основе исходного объекта и не должны воссоздаться. Это может эффективно использовать память и не вызовет отходы пространства памяти. Эта особенность объектов может быть названа изменчивой, что означает «изменяемый» на китайском языке.
Для изменяемых объектов его гибкость и изменения могут иногда стать его недостатками. Чем более гибкие и изменчивые данные, тем сложнее контролировать. Для объекта со сложной структурой данные случайно изменены непреднамеренно. Если объект используется в нескольких областях, трудно предвидеть, изменится ли данные.
var obj = {/* объект со сложной структурой*/}; dosomething (obj); // после завершения вышеуказанной функции строки функции, OBJ все еще является исходным OBJ в настоящее время?Чтобы решить эту проблему, обычное решение может скопировать новый объект, глубоко копировав объект, а затем изменяя его на новом объекте. Это может обеспечить управляемость данных, но частое копирование приведет к большому количеству отходов памяти.
var obj = {/* объект со сложной структурой*/}; // Копия создает новый OBJ2 //, но операция копирования будет тратить пространство памяти var obj2 = deepClone (obj); dosomething (OBJ2); // после того, как вышеупомянутая функция закончена, независимо от того, изменяется OBJ2, OBJ определенно будет оригинальным OBJ.Необычный объект
Чтобы лучше решить вышеуказанные проблемы, появляется неизменная объект, который «неизменен» буквально переводится на китайский. Каждый раз, когда модифицируется неизменный объект, создается новый неизменный объект. Операция на новом объекте не повлияет на данные исходного объекта. Этот специальный объект не является новой функциональной особенностью JavaScript, а набор решений, предоставленных отраслью для решения этой проблемы, и появились некоторые превосходные библиотеки с открытым исходным кодом, наиболее известным из которых является Facebook Lee Byron с открытым исходным кодом Immutable.js. Конечно, решение Immutable не является оригинальным, но происходит от Clojure и Scala.
Сравнение производительности между изменчивым и неизменным
Неэффективная работа изменяющих объектов в основном отражается в репликации и сравнении, а неизменный объект решает эти две неэффективные болевые точки.
Глубокая операция копии обычных изменяющихся объектов скопирует все данные. Им неизбежный объект не будет копировать все данные при изменении данных, но будет передавать отношение родительского ребенка между измененным узлом и неизменным узлом в новый узел, аналогичный структуре связанного списка. С точки зрения «копии», минимизация репликации достигается, а неизменные части используются. При копировании изменяется «полная», а неизменная - «инкрементная», что определяет высокую или низкую скорость использования пространства памяти.
И на основе функции, которую каждый раз изменяется об неизменное объект, будет создан новый неподвижный объект. Это может сохранить измененное состояние данных в набор снимков, что также довольно удобно.
Давайте поговорим о операции сравнения. Для изменяемых объектов, если вы хотите сравнить, равны ли два объекта, вы должны пройти каждый узел объекта для сравнения. Для объектов со сложными структурами их эффективность определенно не намного выше. Для неизменных объектов Immutable.js предоставляет API, который непосредственно определяет, равны ли «значения» двух неизменных объектов.
var map1 = immutable.map ({a: 1, b: 1, c: 1}); var map2 = immutable.map ({a: 1, b: 1, c: 1}); assert (map1! == map2); // Для различных неизменных экземпляров справочный адрес утверждают (immutable.is (map1, map2)); // значения MAP1 и MAP2 равны, а значения утверждают (map1.equals (map2)); // функции неизменного.В реальных приложениях для разработки производительность не всегда является наиболее важной и важной. Для обычных проектов JavaScript контролируемость данных, вызванных характеристиками импертируемых, является более выгодной, чем производительность. Для изменяемых объектов он подходит для использования в замкнутом объеме, в то время как неизменные объекты подходят для использования, когда данные необходимо передавать по нескольким областям.
Разница между изменчивым и неизменным
Immutable.js предоставляет множество имитабельных структур данных: включая карту стека списков, установленная установка упорядоченной записи, которая примерно соответствует нативной изменяемой структуре данных.
各数据结构的用法这里不细说,主要说说Immutable 对象与Mutable 对象在使用上的区别吧。
Нативные изменчивые объекты очень удобны для «чтения» и «написания».
var mitableObj = {}; // Написать данные mitableObj.foo = 'bar'; // чтение консоли данных.Необвиченный объект должен «читать» и «записать» данные через набор и получить.
var ImmatableObj1 = Immutable.map (); // Записать данные var immutableObj2 = ImmutableObj1.set ('foo', 'bar'); // Читать консоль данных. // => 'bar'Чтобы проиллюстрировать использование метода SET, приведенный выше пример создал пустой объект в начале, и на самом деле начальное значение может быть передано во время экземпляра.
var ImmatableObj = immutable.map ({'foo', 'bar'});Для данных с более глубокими уровнями интерфейс доступа, предоставленный Immutable.js, очень удобен.
var immutableObj1 = Immutable.fromJS({ a: { b: 'c' }, d: [1, 2, 3]});// Read deep data console.log(immutableObj1.getIn(['a', 'b'])); // => 'c'console.log (ImmutableObj1.getin ([' a ',' b '])); // => 2 // Модифицировать глубокие данные var var immutableObj2 = ImmutableObj1.setin (['a', 'b'], 'd'); console.log (ImmutableObj2.getin (['a', 'b'])); // => 'D'Если это нативный изменяющийся объект, может сообщать о неопределенной ошибке при доступе к глубокому уровню данных в цепочке, в то время как об неизменном объекте не будет сообщать об ошибке при столкновении с этой ситуацией, и возврат не определен.
При отладке, если вы хотите просмотреть внутреннюю структуру неизменного объекта, рекомендуется использовать tojson (), чтобы сначала преобразовать его в нормальный измененный объект.