The seven primitives, one reference type, and the coercion rules that trip everyone up.
JavaScript has seven primitive types — string, number, boolean, null, undefined, symbol, and bigint — plus a single reference type, object, that everything else (arrays, functions, dates) is built on. The core distinction that matters isn't the list of types, it's how they're stored and compared: primitives are compared and copied by value, while objects are compared and copied by reference, which is why two identical-looking objects are never === to each other.
Because JavaScript is dynamically and loosely typed, values get coerced constantly, often invisibly. == triggers type coercion following a specific set of rules (which is why '' == 0 is true but '' == '0' is false), while === never coerces. typeof and instanceof look similar but check different things — typeof null famously returns 'object', a decades-old bug that's now permanent for backwards compatibility, and typeof only reliably distinguishes primitives, not object subtypes.
What you'll walk away knowing