The single release that reshaped how modern JavaScript is written.
ES6 (ES2015) introduced most of the syntax that defines 'modern' JavaScript: let and const with block scoping, arrow functions, template literals, destructuring, default and rest parameters, the spread operator, and native support for classes, modules, and Promises. Individually these look like syntax convenience, but together they solved real, longstanding problems — block scoping alone fixed most of the var-related closure and hoisting bugs that plagued pre-ES6 code.
Some ES6 features go deeper than syntax. Modules (import/export) introduced a standardized way to split code across files with static analysis benefits that CommonJS's require() can't match. Symbols added a genuinely new primitive type for creating unique, collision-free property keys. And iterables/iterators (the same protocol behind generators) unified how for...of, spread, and destructuring all pull values out of a collection — one mechanism powering several unrelated-looking features.
What you'll walk away knowing