Similar yet different. So confusing

stereobooster on October 28, 2018

There are concepts which are very similar, yet different and confuses many people. Referential transparency vs immutability Referential transpa... [Read Full]
markdown guide
 
const a = { x: 1 };
a = { z: 1 }; // TypeError: Assignment to constant variable

this is a TypeError because by assigning a a new object value you are changing the prototype as well. Note: a = { x: 3 } wouldn't work either because while this new object's prototype has the same signature as the original value of a it is still a new prototype.

 
const a = { x: 1 }
a = { x: 1 } // TypeError: Assignment to constant variable.

I would say referential transparency is in different realm, this is not a type error in common case (though can seem like one in some cases).

It is in different realm the same way as borrow checker in Rust. Immutability is also in different realm, but can be modeled with types, for example with Readonly<T> in TypeScript or $ReadOnly<T> in Flow.

 

I might be wrong, but

const a = {x: 1}

is actually assigning a pointer to an object to a, so this:

const a = {x: 1};
a = {x: 2};

cannot work, because you are changing the value of a with a new pointer.

no problem with

a.x = 2

because you don't change the value of a: it's still the same pointer to the same object.

So to me it's correct to say const for immutability, because in your example it's not possible to change the real value of a (which is an address).

As I said, I might be wrong, but it's how I understand the concept and for now it hasn't failed me yet ๐Ÿ˜„

Referential transparency - means you can't reassign variable.

const a = { x:  1 };
const b = a;
a.x = 2;
a === b; //true, because it is the same reference

Immutability - means you can't mutate object.

let a = Object.freeze({x : 1})
a.x = 2;
a.x === 1; // true, because a is immutable
 

I always get the authentication and authorization terms wrong even when I know there is a difference between them.

Great article! Didn't know about Object.freeze

 
 

BSD vs GNU utilities. Both are POSIX compliant but the CLI options are just different enough to throw me off every time.

code of conduct - report abuse