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.