【发布时间】:2021-04-01 12:12:23
【问题描述】:
假设你有一个变量:
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(),并在您想要执行诸如将元素附加到列表之类的操作时为其提供回调函数。
【问题讨论】:
-
不同之处在于,如果两个变量引用同一个对象,通过一个引用对其进行变异意味着任何更改也通过另一个引用可见;而如果您创建一个具有不同状态的新对象并将其分配给一个变量,则另一个变量仍保留对原始未更改对象的引用。
-
我明白了,这是否意味着“可变性”作为一个概念主要与没有指针的语言相关?
-
我不明白这是怎么回事;指针是一种引用。
-
不变性的概念就是变量不会改变,即变量的值始终是初始化时的值。这有很多好处,也有很多缺点。在追加情况和重新分配 x 情况下,变量的值都不再是初始化时的值,因此这两个示例都没有 x 是不可变的。我想说,通过 React 的视角来看待不变性会让事情变得混乱,它本身就是一个想法,是的,React 使用它,是的,它让一些事情变得乏味