Скажем, у вас есть переменная:
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()
и передать ему функции обратного вызова, если вы хотите сделать что-то вроде добавления элемента в список.