Now that we have done {T272104}, we should consider doing the same thing for ES2016, ES2017, or whatever version makes sense.
We will have to consider the benefits of new language features in a given ES version versus the costs of dropping browsers that don't support it, and the complexity of feature detection.
Notable features in new versions:
- ES2016: nothing spectacular (just `Array.prototype.includes` and the `**` operator)
- ES2017: async functions, `Object.values()`/`Object.entries()`, `padStart()`/`padEnd()` for strings (+ shared memory features that were disabled for a while due to security challenges)
- ES2018: async iteration (`for await`), spread (`...`) in object literals, `Promise.finally()`, regex features (named capture groups, lookbehind, `/s` flag, `\p{...}`)
- ES2019: optional catch binding, `flat()`/`flatMap()` for arrays, `trimStart()`/`trimEnd()` for strings, `Object.fromEntries()`
- ES2020: `??` and `?.` operators, dynamic import, `import.meta`, `export * as Foo from 'bar', BigInt, `matchAll()`, `globalThis`, `Promise.allSettled()`