javascript中的不可变值

时间:2016-03-28 03:55:05

标签: javascript variables immutability mutable

我目前正处于JavaScript的学习过程中,并且真的对不可变值感到困惑。我的理解是,当创建一个值(stings / numbers / booleans)时,它永远不会被改变。

现在我的问题是,我赋值的变量,该变量的值是可变的。我可以为该变量分配新值。那么为什么不变性很重要呢?

另外,当我为变量赋值时,前一个值会发生什么?它会留在记忆中并阻挡一些空间吗?它是否从该变量中丢失了指针?究竟发生了什么?

请帮助我理解JavaScript中“Mutable”和“Immutable”概念的实际用途。提前谢谢。

1 个答案:

答案 0 :(得分:4)

您看起来对此感到困惑

赋值变量 nothing 与不可变或可变对象有关。变量只是一个别名:引用到内存中的对象。当您更改变量的值时,您所做的就是告诉编译器停止将该对象与此变量相关联,并将其与另一个对象相关联。赋值不会影响底层对象 - 对象永远不会改变,您再也无法再访问它了。

通常,当对对象的所有引用都丢失时,它们被垃圾收集,即为对象分配的内存被释放并且对象永远丢失。但是,这也与不可变对象和可变对象之间的区别无关。

不可变对象和可变对象之间的真正区别

不可变对象不会修改对象到位(即改变它的样子) - 它们会在变量变化的情况下返回数据的新副本

Javascript中的可变对象不返回副本,但允许您更改对象本身。

我把它比作array.splice()array.slice()之间的区别。 splice()将通过删除/插入需要的元素来更改原始数组 - slice()将创建一个只包含所需元素的新数组。他们可以做同样的事情 - 但是一个将数组变异到位,另一个创建一个副本。

不可变对象在更改时必须始终返回新副本 - 它本身不会被更改。一个可变对象可以 - 但不必 - 在适当的位置进行变异。 Javascript中的原始类型大多是不可变的 - 一旦创建就无法更改字符串的形式(如果在JS字符串上调用replace,您将收到一个新字符串,其中包含您要求替换的值,而不是相同的字符串随着价值的变化)。对象大多是可变的:例如,您可以执行object[key] = value并在引用的任何位置更改对象。

TL;博士

当您更改可变对象时,它会被更改进行更改。当您更改不可变对象时,它根本不会更改 - 将创建一个新对象,并且对该对象的所有旧引用将为您提供原始对象,并且没有任何不同。