Objeto mutável
In JavaScript, objects are reference-type data. A vantagem é que, quando os objetos são frequentemente modificados, eles são modificados com base no objeto original e não precisam ser recriados. This can effectively utilize memory and will not cause waste of memory space. This feature of objects can be called Mutable, which means "mutable" in Chinese.
For Mutable objects, its flexibility and change may sometimes become its disadvantages. Quanto mais flexíveis e mutáveis forem, mais difícil é controlar. Para um objeto com uma estrutura complexa, os dados são acidentalmente modificados inadvertidamente. If the object is used in multiple scopes, it is difficult to foresee whether and when the data will change.
var obj = {/* um objeto com uma estrutura complexa*/}; dosomething (obj); // Depois que a linha de função acima terminar, o OBJ ainda é o OBJ original no momento?针对这种问题,常规的解决办法可以通过将对象进行深拷贝的形式复制出一个新的对象,再在新对象上做修改的操作,这样能确保数据的可控性,但是频繁的复制会造成内存空间的大量浪费。
var obj = {/* um objeto com uma estrutura complexa*/}; // A cópia cria um novo obj2 //, mas a operação de cópia desperdiçará o espaço da memória var obj2 = DeepClone (obj); dosomething (obj2); // Após a finalização da função acima, independentemente de obj2 alterações, o obj será definitivamente o obj originalImmutable 对象
In order to better solve the above problems, the Immutable object appears, which is "immutable" literally translated into Chinese. Each time an Immutable object is modified, a new immutable object is created. Operation on the new object will not affect the data of the original object. Este objeto especial não é o novo recurso funcional do JavaScript, mas um conjunto de soluções fornecidas pelo setor para resolver esse problema, e algumas excelentes bibliotecas de código aberto surgiram, a mais famosa das quais é o imutável de código aberto do Facebook. Of course, Immutable's solution is not original, but comes from Clojure and Scala.
Mutable 和Immutable 的性能对比
A operação ineficiente de objetos mutáveis é refletida principalmente na replicação e comparação, e o objeto imutável resolve esses dois pontos ineficientes.
The deep copy operation of ordinary Mutable objects will copy the entire data. O objeto imutável não copiará os dados inteiros ao modificar os dados, mas transferirá o relacionamento pai-filho entre o nó alterado e o nó inalterado para um novo nó, semelhante à estrutura de uma lista vinculada. From the perspective of "copy", the minimization of replication is achieved, and the unchanged parts are shared. Mutable is "full" when copying, while Immutable is "incremental", which determines the high or low usage rate of memory space.
并且基于每次修改一个Immutable 对象都会创建一个新的Immutable 对象的这种特性可以将数据的修改状态保存成一组快照,这也是挺方便的。
再来说说比较操作。 Para objetos mutáveis, se você deseja comparar se os dois objetos são iguais, deve atravessar cada nó do objeto para comparação. For objects with complex structures, their efficiency is definitely not much higher. For Immutable objects, immutable.js provides an API that directly determines whether the "values" of two Immutable objects are equal.
var map1 = imutable.map ({a: 1, b: 1, c: 1}); var map2 = imutable.map ({a: 1, b: 1, c: 1}); assert (map1! == map2); // For different Immutable instances, the reference address assert(Immutable.is(map1, map2)); // The values of map1 and map2 are equal, and the values assert(map1.equals(map2)); // The functions of Immutable.is are the sameNas aplicações reais de desenvolvimento, o desempenho nem sempre é o mais crítico e importante. Para projetos JavaScript comuns, a controlabilidade dos dados provocados pelas características do imutável é mais vantajosa que o desempenho. Para objetos mutáveis, é adequado para uso em um escopo fechado, enquanto objetos imutáveis são adequados para uso quando os dados precisam ser transmitidos por vários escopos.
Mutable 和Immutable 在使用上的区别
Immutable.js fornece uma variedade de estruturas de dados imutáveis: incluindo o registro de listar mapa de mapa da pilha de mapa, que corresponde aproximadamente à estrutura de dados mutáveis nativos.
Não vou explicar o uso de cada estrutura de dados aqui, mas falar principalmente sobre a diferença entre o uso de objetos imutáveis e objetos mutáveis.
原生的Mutable 对象在「读」和「写」上非常方便。
var mutableObj = {};// 写入数据mutableObj.foo = 'bar';// 读取数据console.log(mutableObj.foo);而Immutable 对象需要通过set 和get 来对数据进行「读」和「写」。
var imutableObJ1 = imutable.map (); // grava dados var imutableObj2 = imutableObj1.set ('foo', 'bar'); // leia o console de dados (imutableObj2.get ('foo')); // => 'bar'Para ilustrar o uso do método de conjunto, o exemplo acima criou um objeto vazio no início e, de fato, o valor inicial pode ser passado durante a instanciação.
var immutableObj = Immutable.Map({'foo', 'bar'});对于层级比较深的数据,immutable.js 提供的访问接口很方便。
var immutableObj1 = Immutable.fromJS({ a: { b: 'c' }, d: [1, 2, 3]});// 读取深层级的数据console.log(immutableObj1.getIn(['a', 'b'])); // => 'c'console.log(immutableObj1.getIn(['d', 1])); // => 2// 修改深层级的数据var immutableObj2 = immutableObj1.setIn(['a', 'b'], 'd');console.log(immutableObj2.getIn(['a', 'b'])); // => 'd'Se for um objeto mutável nativo, um erro indefinido pode ser relatado ao acessar um nível profundo de dados em uma cadeia, enquanto um objeto imutável não relatará um erro ao encontrar essa situação, e o retorno é indefinido.
Ao depurar, se você deseja visualizar a estrutura interna de um objeto imutável, é recomendável usar Tojson () para convertê -lo em um objeto mutável normal primeiro.