14.05.2025, Отзыв предложения Record & Tuples, Объяснение Composites

На очередном собрании TC39 было отклонено предложении Record & Tuples, которое было уже на стадии 2, основная цель которого было в том, чтобы дать нам возможность работать с иммутабельными структурами в JS, что в свою очередь позволило бы сравнивать объекты не по ссылкам, а по значениям.

Синтаксис был следующим:

const record = #{ name: 'John', age: 30 };
const tuple = #[0, 1, 2];

и мы могли бы их сравнивать обычным равенством:

console.log(#{ key: 1 } === #{ key: 1 }); // true
console.log(#{ nested: #{ key: 2 } } === #{ nested: #{ key: 2 } }); // true

Вместо Record & Tuples было внесено новое предложение - Composites, которое сейчас на стадии 1. И его цель такая же, как и в Record & Tuples за исключением того, что это не новый синтаксис, а специальный класс со своими методами:

const record = Composite({ name: 'John', age: 30 });
// НО Tuples ещё нет!
const tuple = Composite(0, 1, 2); // или возможен Composite.of()
 
const isEqual = Composite.equal(
	Composite({ nested: Composite({ key: 3 }) }),
	Composite({ nested: Composite({ key: 3 }) })
); // true
 
const isNotEqual = Composite.equal(
	Composite({ nested: Composite({ key: 3 }) }),
	Composite({ nested: Composite({ key: 3, anotherKey: 4 }) })
); // false

Composites позволяет использовать внутри значений символы и прототипы, а также вообще любые значения, которые в свою очередь будут shallowly immutable.