Immutability and referential transparency has many known benefits and ability for optimization. Several modern JavaScript libraries take advantage of this, and many more functional compile-to-JS languages.
This is based upon the Value Types proposal (Typed Objects / Explainer).
All these types provide value equality for both ==
and ===
.
Records are a new value type that represents the value type analogy of an immutable object.
const xy = #{ x: 1, y: 2 }; // frozen value type
const xyz = #{ ...xy, z: 3 }; // functional extension
Tuples are a new value type that represents the value type analogy of an immutable array, without holes. It cannot be sparse.
const xy = #[ x, y ]; // frozen value type
const xyz = #[ ...xy, z ]; // functional extension
ImmutableMap is an immutable version of Map. Any mutable operation returns a new ImmutableMap instead of mutating the existing reference.
const a = new ImmutableMap([['x', 1], ['y', 2]]);
const b = a.set('y', 3);
a.get('y'); // 2
b.get('y'); // 3
ImmutableSet is an immutable version of Set. Any mutable operation returns a new ImmutableSet instead of mutating the existing reference.
const a = new ImmutableSet([1, 2]);
const b = a.add(3);
a.size; // 2
b.size; // 3
It is my intention to propose this as a Stage 0 proposal to ECMAScript 7.