What are Symbols, why are they useful, and what are well-known symbols?
Understanding unique property keys and the hooks that customize built-in language behavior.
A Symbol is a unique, immutable primitive; every Symbol('desc') is distinct even with the same description, so it can be used as a property key that will never collide with another key — including keys added by other libraries on the same object. That makes symbols ideal for non-enumerable-ish metadata and quasi-private fields (they don't show up in for...in or JSON.stringify, though Object.getOwnPropertySymbols and Reflect.ownKeys can still reach them, so they're not true privacy — use # class fields for that). Symbol.for(key) uses a global registry to share a symbol across realms/files by string key. Well-known symbols are built-in symbols the engine looks up to customize language behavior: Symbol.iterator (makes an object iterable for for...of/spread), Symbol.asyncIterator (for-await-of), Symbol.hasInstance (customize instanceof), Symbol.toPrimitive (control coercion), and Symbol.toStringTag (the [object X] tag). Implementing these lets your objects integrate with core syntax rather than requiring special methods.
Collision-free metadata keys on shared objects, making objects iterable/awaitable, and customizing instanceof/coercion via well-known symbols.