不变性:功能编程的基石,也为面向对象的编程提供了重要的优势。本文探讨了JavaScript中的不变性,详细介绍了其实施和收益。
密钥概念:
是一个新字符串;
保持不变。 字符串方法创建新字符串;他们不修改原始内容。这是因为字符串是不变的。数字共享此特征。
JavaScript中的<code class="language-javascript">const statement = "I am an immutable value"; const otherStr = statement.slice(8, 17); </code>
可突变性:otherStr
>
JavaScript的内置字符串和数字是不可变的。但是,阵列是可变的:statement
的行为会有所不同:
同样,当属性为“设置”时,
(替换对象)将返回一个新对象<code class="language-javascript">let arr = []; let v2 = arr.push(2); // arr is modified; v2 holds the new length</code>实践中的不变性(使用不变。
>由于JavaScript缺乏天然不变的结构,因此我们使用像Inmuthable.js这样的库。 让我们考虑一个扫雷游戏示例。董事会是一张不变的地图,ImmutableArray
是不可变的地图列表(每个瓷砖)。 初始化使用
<code class="language-javascript">const arr = new ImmutableArray([1, 2, 3, 4]); const v2 = arr.push(5); arr.toArray(); // [1, 2, 3, 4] v2.toArray(); // [1, 2, 3, 4, 5]</code>函数:
ImmutableMap
<code class="language-javascript">const person = new ImmutableMap({name: "Chris", age: 32}); const olderPerson = person.set("age", 33); person.toObject(); // {name: "Chris", age: 32} olderPerson.toObject(); // {name: "Chris", age: 33}</code>标志着揭示的瓷砖。 使用可变的数据:
有了不变的数据,我们使用
:>
tiles
immutable.js
fromJS
返回一个新的不变实例。 为了鲁棒性,我们可以使用
<code class="language-javascript">function createGame(options) { return Immutable.fromJS({ cols: options.cols, rows: options.rows, tiles: initTiles(options.rows, options.cols, options.mines) }); }</code>
revealTile
性能考虑:
<code class="language-javascript">function revealTile(game, tile) { game.tiles[tile].isRevealed = true; //Direct mutation }</code>在创建新对象的同时,“结构共享”在创建新对象时,将内存开销最小化。 不可分率的好处通常超过了性能的影响。 改进的变更跟踪:
不变性简化了UI框架中的更改跟踪。 比较参考()有效地确定状态是否已更改。
结论:
不变性提高了代码质量和可维护性。 在需要学习曲线的同时,其收益通常大于最初的挑战。 探索一个完整的扫雷示例所提供的Codepen(原始文本中未提供的链接)。
a === b
以上是JavaScript中的不变性的详细内容。更多信息请关注PHP中文网其他相关文章!