Неделю назад жаловался на отсутствие иммутабельных структур в JS, а тут вдруг всплыл интересный пропозал по добавленю в JS иммутабельных Record и Tuple (кортежей).



Если кратко, то предлагается добавить в язык два новых «сложных» иммутабельных примитива, собственно Record и Tuple.

Описываются они так



const record = #{ a: 1, b: 2 }



const tuple = #[1, 2]




Мутировать их нельзя, внутри могут лежать только примитивы, никаких ссылок на объекты и функции (но над этим работают, возможно ссылки разрешат). Так как это примитивы, то сравниваются они по значению, а не по ссылкам





const record1 = #{ a: 1, b: 2 }

const record2 = #{ a: 1, b: 2 }

const record3 = #{ ...record1 }

const record4 = #{ b: 2, a: 1 }



record1 === record2 // true

record1 === record3 // true

record1 === record4 // true ключи сортируются лексически






Ещё раз — это примитивы





typeof #{ a: 1 } === "record"

typeof #[1, 2,3] === "tuple"






Так как кортежи выглядят как массивы, то очень хотелось бы к ним применять методы из Array.prototype, но проблема в том, что многие методы там мутирующие. Так что вместе с этим пропозалом едет второй пропозал с добавлением иммутабельных методов в Array и TypedArray



• Array.prototype.toReversed() -> Array

• Array.prototype.toSorted(compareFn) -> Array

• Array.prototype.toSpliced(start, deleteCount, ...items) -> Array

• Array.prototype.with(index, value) -> Array




И он уже на Stage 3 и приедет к нам прежду всего с новым Safari



Ну и вдогонку доклад https://portal.gitnation.org/contents/record-and-tuple-immutable-data-structures-in-js