Как се различава променливостта от присвояването на нова стойност на променлива?

Кажете, че имате променлива:

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() и захранването му с функции за обратно извикване, ако искате да направите нещо като добавяне на елемент към списък.


person Null Salad    schedule 22.12.2020    source източник
comment
Разликата е, че ако две променливи препращат към един и същ обект, мутирането му чрез една препратка означава, че всички промени са видими и през другата препратка; докато ако създадете нов обект с различно състояние и го присвоите на една променлива, другата променлива все още съдържа препратка към оригиналния непроменен обект.   -  person kaya3    schedule 22.12.2020
comment
Разбирам, това означава ли, че променливостта като концепция е най-вече уместна за езици без указатели?   -  person Null Salad    schedule 22.12.2020
comment
Не виждам как следва това; указателят е вид препратка.   -  person kaya3    schedule 22.12.2020
comment
Идеята за неизменност е просто, че променливата не се променя, т.е. стойността на променлива винаги е такава, каквато е била, когато е била инициализирана. Това има много предимства и много недостатъци. И в случая на добавяне, и в случая на преназначаване на x стойността на променливите спира да бъде това, което е била, когато е била инициализирана, така че в нито един от примерите x не е неизменен. Бих казал, че гледането на неизменността през призмата на React обърква въпроса, това е идея сама по себе си, която да, React използва и да, прави някои неща досадни   -  person Countingstuff    schedule 22.12.2020


Отговори (1)


Има променливи и има стойности. Променливите са като имена или адреси, с които се отнасяме към стойностите. Променливостта се отнася за стойности, не за променливи.

Променлива стойност може да се промени на място, без да се създава нова стойност. Например, ако създам целочислена стойност и й присвоя стойността на единица, след това мога да увелича тази стойност, без да отделям място за ново цяло число; стойността се увеличава на място. Всички препратки към тази стойност незабавно ще видят промяната, защото се отнасят до единствената стойност, която сега е променена - или мутирала.

Неизменните стойности не могат да се променят на място. Да предположим, че низовете са неизменни в нашия език. Ако създам низ и го инициализирам със стойността hello world, не е възможно да променя тази стойност, без да създам място за нов низ. Ако искам да променя стойността на goodbye world, трябва да създам нова стойност на низ с новоразпределена памет. Всички променливи, които препращат към първоначалната стойност, ще продължат да го правят, освен ако не бъдат актуализирани, за да препращат към новата стойност.

Константността е подобна концепция, която се прилага за променливи и е свързана с това дали нещото, към което се позовава променливата, има право да се променя. Това се замъглява малко с примитивните типове; наистина, променлива const int трябва да може да се увеличава, тъй като увеличаването на int не променя споменатата памет, а само нещата в тази памет. Списъци с постоянни/само за четене обаче обикновено могат да се добавят и премахват без проблем, например, така че разграничението между постоянство (на препратка към променлива) и неизменност (на стойност) е малко по-добре запазено там.

person Patrick87    schedule 28.12.2020