В чем разница между Subject, BehaviorSubject и ReplaySubject

Ответ

Subject - это простой Observable, который не хранит предыдущие значения. Подписчики получают только те значения, которые были отправлены после подписки.

const subject = new Subject<number>();
subject.next(1);
subject.subscribe(console.log); // Не получит 1
subject.next(2); // Выведет 2

BehaviorSubject хранит последнее отправленное значение. Новые подписчики сразу получают это значение. Требует начального значения.

const behavior = new BehaviorSubject<number>(0);
behavior.next(1);
behavior.subscribe(console.log); // Выведет 1 сразу
behavior.next(2); // Выведет 2

ReplaySubject хранит указанное количество предыдущих значений (буфер) и отправляет их новым подписчикам.

const replay = new ReplaySubject<number>(2);
replay.next(1);
replay.next(2);
replay.next(3);
replay.subscribe(console.log); // Выведет 2, 3 сразу

Ответ 18+ 🔞

Так, слушай, раз уж ты тут с этими своими Subject'ами разбираешься, давай я тебе на пальцах объясню, а то в документации, блядь, мозг сломать можно, ёпта.

Вот представь, есть у тебя Subject — это как мудак самый обычный. Кричишь ты ему в спину: «Эй, Вась, единица!». А он тебя нихуя не слышит, потому что он к тебе задом стоит. Потом он оборачивается, ты ему «Эй, двойка!» — вот тут он уже «А, два!» и записал. Раньше подошёл — нихуя не получил, опоздал, пиши пропало. Ничего не хранит, забывчивый пидарас.

const subject = new Subject<number>();
subject.next(1); // Крикнул в пустоту
subject.subscribe(console.log); // Подошёл поздно
subject.next(2); // А вот тут уже услышал — выведет 2

А вот BehaviorSubject — это уже чувак с записной книжкой, но, блядь, с одной-единственной страницей. Ты ему при создании суёшь в руку бумажку «ноль» и говоришь: «Запомни!». Потом ты ему «Единица!» — он её записывает, старую рвёт. Новый подписчик подбегает — он ему сразу эту последнюю бумажку тычет в ебло: «На, читай, единица!». Не пропустит, хитрая жопа.

const behavior = new BehaviorSubject<number>(0); // Держи, ноль, запомни!
behavior.next(1); // А теперь единица!
behavior.subscribe(console.log); // Новый чувак — получает 1 СРАЗУ
behavior.next(2); // Все получают 2

Ну и ReplaySubject — это уже, сука, архивный маньяк. Ты ему говоришь: «Запоминай последние N сообщений». Допустим, N=2. Ты ему: «Раз!», «Два!», «Три!». Он в своей голове держит «Два» и «Три». Новый подписчик приходит — он ему вываливает всю эту историю: «Держи, дружок, два и три, изучай, нехуй тут». Как магнитофон, блядь, с буфером.

const replay = new ReplaySubject<number>(2); // Запоминай два последних!
replay.next(1);
replay.next(2);
replay.next(3); // В буфере теперь 2 и 3
replay.subscribe(console.log); // Новый подписчик — БАЦ! — получает 2 и 3 сразу

Вот и вся разница, ебать мои старые костыли. Выбирай, кто тебе больше по душе: забывчивый, с одной бумажкой или тот, который всю историю помнит.