一个关于 immutable data 处理的 JavaScript 模块,不修改原始值获得一份数据拷贝。使用 ES6 预发重写,并主要集中在性能以及更加好用的 API。
链式 API 调用,使用非常方便;
通过 path string 的方式寻找需要修改的节点,简化代码;
也许可以获得更好的性能;
使用 NPM 下载:
npm install -S immutability-util
然后使用方法如下:
const iu = require('immutability-util'); // or import iu from 'immutability-util'; // obj need to be mutated. var obj = { a: 1, b: 2, c: { d: 3, e: { f: [4, 5, 6], g: { h: 'iu', }, }, i: { j: 'hello, world.', k: [7, 8, 9], l: [10, 11, 12], } }, }; // chainable usage. const state = iu(state) .$apply(['a'], v => v + 1) .$merge(['c', 'e', 'g'], { m: 'update'}) .$push(['c', 'e', 'f'], [7, 8, 9]) .$set(['c', 'i', 'j'], 'hello node 8.') .$splice(['c', 'i', 'k'], [1, 1, 10]) .$unset(['c'], ['d']) .$unshift(['c', 'i', 'l'], [13]) .value(); // then get the mutated copy. // or use path string. iu(obj).$set('c.i.j', 'hello node 8.').value();
另外,也可以使用以下的方式处理数组路由;
const obj = { a: { b: [{ c: [1, 2, 3], }, { d: 4, }, { e: [5, 6], }] } }; const state = iu(obj) .$apply('a.b[1].d', v => v + 1) .$push('a.b[0].c', [4]) .$set('a.b[2].e[0]', 'hello node 8.') .value();
当获得了 ImmutabilityUtil
的实例后(引入模块就获得了),可以使用以下的方法:
$apply(path, function)
: 传入一个 function,并且把当前节点作为值传入;
$merge(path, object)
: 类似于数组的 merge 操作;
$push(path, array)
: 类似于数组的 push 操作;
$set(path, any)
: 直接替换对应位置的数据;
$splice(path, array_of_arrays)
: 类似于数组的 splice 方法;
$unset(path, array_of_strings)
: 删除键值;类似于 delete 方法;
$unshift(path, array)
: 类似于数组的 unshift 方法;
然后就可以使用 API value()
得到 immutable 数据拷贝。欢迎 pr 更多的操作方法;
通过下面的命令来 buikd 和测试:
npm run build # run the testcases npm run test
也可以运行 npm run benchmark
来查看性能对比。
MIT@hustcc.
这节主要是讲 可变对象给编程带来的危害,所谓不可变对象,就是整个生命周期中不可变的对象(废话), e.g. : String 具体来说参见 Basic Java when we discussed snapshot diagrams Risks of mutation risk1:passing mutable values 看以下两段代码: /** @return the sum of the
一、简单定义 不可变对象(Immutable Objects)即对象一旦被创建它的状态(对象的数据,也即对象属性值)就不能改变,反之即为可变对象(Mutable Objects)。 不可变对象的类即为不可变类(Immutable Class)。Java平台类库中包含许多不可变类,如String、基本类型的包装类等。 二、编写不可变类 可以遵照以下几点来编写一个不可变类: 确保类不能被继承
在python中,字符串数据类型是不可变的。 这意味着无法更新字符串值。 我们可以通过尝试更新字符串的一部分来验证这一点,这将导致我们出错。 # Can not reassign t= "wenjiangs" print type(t) t[0] = "M" 当我们运行上面的程序时,我们得到以下输出 - <type> t[0] = "M" TypeError: 'str' object doe
模块 模块是任何健壮的应用程序体系结构不可或缺的一部分,特点是有助于保持应用项目的代码单元既能清晰地分离又有组织。 在JavaScript中,实现模块有几个选项,他们包括: 模块化模式 对象表示法 AMD模块 CommonJS 模块 ECMAScript Harmony 模块 我们在书中后面的现代模块化JavaScript设计模式章节中将探讨这些选项中的最后三个。 模块化模式是基于对象的文字部分,
问题内容: 在Github上查看CoffeeScript的源代码时,我注意到大多数(如果不是全部)模块定义如下: 这种模式看起来像是将整个模块包装在一个匿名函数中并调用自身。 这种方法的优点(和缺点)是什么?还有其他方法可以实现相同的目标吗? 问题答案: Harmen的答案是相当不错的,但让我详细说明一下CoffeeScript编译器在何处完成此操作以及原因。 当您使用编译内容时,总会得到如下所示
每个模块都有一个名称,在模块中可以通过语句来找出模块的名称。这在一个场合特别有用——就如前面所提到的,当一个模块被第一次输入的时候,这个模块的主块将被运行。假如我们只想在程序本身被使用的时候运行主块,而在它被别的模块输入的时候不运行主块,我们该怎么做呢?这可以通过模块的__name__属性完成。 使用模块的__name__ 例8.2 使用模块的__name__ #!/usr/bin/python
本文向大家介绍javascript设计模式之module(模块)模式,包括了javascript设计模式之module(模块)模式的使用技巧和注意事项,需要的朋友参考一下 模块是任何强大应用程序中不可或缺的一部分,它通常能帮助我们清晰地分离和组织项目中的代码单元。 js中实现模块的方法: 1.对象字面量表示法 2.Module模式 3.AMD模块 4.CommonJS模块 5.ECMAS
问题内容: 我最近正在读《 学习JavaScript设计模式》 这本书。我没有得到的是模块模式和显示模块模式之间的区别。我觉得他们是同一回事。有人可以举一个例子吗? 问题答案: 至少有三种不同的方法来实现模块模式,但是显示模块模式是唯一具有正式名称的模块模式后代。 基本模块模式 模块模式必须满足以下条件: 私有成员住在封闭中。 公共成员暴露在返回对象中。 但是这个定义有很多歧义。通过以不同方式解决