0
0
AngularComparisonBeginner · 4 min read

Subject vs BehaviorSubject vs ReplaySubject: Key Differences in Angular

In Angular, Subject is a basic observable that emits values to subscribers only after they subscribe. BehaviorSubject stores the latest value and immediately emits it to new subscribers. ReplaySubject records multiple past values and replays them to new subscribers based on a buffer size.
⚖️

Quick Comparison

Here is a quick table comparing the main features of Subject, BehaviorSubject, and ReplaySubject in Angular.

FeatureSubjectBehaviorSubjectReplaySubject
Initial ValueNo initial valueRequires initial valueNo initial value
Emits to new subscribersOnly future valuesLatest value immediatelyMultiple past values immediately
Stores valuesNoStores latest valueStores multiple values
Buffer SizeN/A1 (latest value)Configurable (default unlimited)
Use CaseSimple event emitterState sharing with current valueReplay multiple past events
⚖️

Key Differences

Subject is the simplest form of observable that does not hold any value. It only emits values to subscribers after they subscribe, so new subscribers miss any previously emitted values.

BehaviorSubject requires an initial value and always stores the latest emitted value. When a new subscriber joins, it immediately receives the current stored value, making it useful for representing state that can be read anytime.

ReplaySubject can store a configurable number of past values (buffer size). New subscribers receive all buffered values right away, which is helpful when you want to replay a series of past events to late subscribers.

⚖️

Code Comparison

This example shows how Subject emits values and how subscribers receive them only after subscription.

typescript
import { Subject } from 'rxjs';

const subject = new Subject<number>();

subject.next(1); // No subscriber yet, so no output

subject.subscribe(value => console.log('Subscriber A:', value));

subject.next(2); // Subscriber A receives 2

subject.subscribe(value => console.log('Subscriber B:', value));

subject.next(3); // Both subscribers receive 3
Output
Subscriber A: 2 Subscriber A: 3 Subscriber B: 3
↔️

BehaviorSubject Equivalent

This example shows BehaviorSubject emitting values and immediately sending the latest value to new subscribers.

typescript
import { BehaviorSubject } from 'rxjs';

const behaviorSubject = new BehaviorSubject<number>(0); // Initial value 0

behaviorSubject.next(1);

behaviorSubject.subscribe(value => console.log('Subscriber A:', value)); // Immediately receives 1

behaviorSubject.next(2);

behaviorSubject.subscribe(value => console.log('Subscriber B:', value)); // Immediately receives 2

behaviorSubject.next(3);
Output
Subscriber A: 1 Subscriber A: 2 Subscriber B: 2 Subscriber A: 3 Subscriber B: 3
🎯

When to Use Which

Choose Subject when you only need to emit events to subscribers from the point they subscribe onward, like simple event emitters.

Choose BehaviorSubject when you want to hold and share the latest state or value with new subscribers immediately, such as current user info or UI state.

Choose ReplaySubject when you want new subscribers to receive a history of past values, like caching multiple events or messages for late subscribers.

Key Takeaways

Subject emits only future values to subscribers without storing any.
BehaviorSubject stores and emits the latest value immediately to new subscribers.
ReplaySubject replays multiple past values to new subscribers based on buffer size.
Use BehaviorSubject for state sharing and ReplaySubject for event replay.
Pick Subject for simple event streams without value caching.