可变性与为变量分配新值有何不同?

How is mutability different from assigning a new value to a variable?

假设你有一个变量:

var x = [1,2]

如果它是一个可变对象,你可以这样做:

x.append(3)
x
>> [1,2,3]

但如果它是不可变的,并且您想更改 x 的值,您实际上必须这样做:

// init x
var x = [1,2]
// add a 3 to x
x = [1,2,3]
x
>> [1,2,3]

可变性和只改变变量有什么区别?

我最好的猜测是,当您执行 append(3) 时,它正在修改对内存中同一变量的引用,但是当您 x = [1,2,3] 时,您可能声明了一个新变量 x,引用了一个新变量内存中的块,并释放 x=[1,2] 占用的旧块。

似乎不​​可变变量应该不能改变。但很多时候我们希望不可变变量发生变化。例如,在 React 中,状态变量被认为是不可变的。但是拥有状态的目的是让变量可以改变。因此,要更改它们的值,您需要通过这些非常迂回的方式,例如调用 setState(),如果您想执行诸如将元素附加到列表的操作,则为其提供回调函数。

有变数就有价值。变量就像我们引用值的名称或地址。可变性适用于值,而不适用于变量。

可以在不创建新值的情况下就地更改可变值。例如,如果我创建一个整数值并将其赋值为 1,那么我可以递增该值而无需为新整数分配 space;该值就地递增。对该值的任何引用都将立即看到更改,因为它们指的是现在已更改或突变的一个值。

不可变值无法就地更改。假设字符串在我们的语言中是不可变的。如果我创建一个字符串并将其初始化为值“hello world”,则无法在不为新字符串创建 space 的情况下更改该值。如果我想将值更改为“再见世界”,我必须使用新分配的内存创建一个新的字符串值。引用原始值的任何变量将继续这样做,除非它们更新为引用新值。

常量是一个类似的概念,适用于变量,与变量引用的事物是否允许更改有关。这与原始类型有点混淆;实际上,const int 变量应该是可递增的,因为递增 int 不会改变所引用的内存,只会改变内存中的内容。但是,constant/readonly 列表通常可以毫无问题地添加和删除,例如,因此(变量引用的)不变性和(值的)不变性之间的区别在那里保存得更好。

所以当你声明一个新的变量时,你创建了一个变量并将相应的值存储在RAM中,如果你使用variable = value语句那么你创建的新值完全与旧值无关,旧的价值永远不会改变,它是不可变的。新值被分配给同一个变量,然后你调用同一个变量,它只是指向 RAM 中的不同位置,旧位置永远不会改变,你创建一个新的变量来替换它。