# ECMAScript features by version

Static detectability of recently-added features

- ❌ = not statically detectable
- 😐 = statically detectable, but chance of false positives
- 👎 = statically detectable, but not worth the false positives

### ES2023

| Name | ESLint / eslint-plugin-es | Chrome since |
| --- | --- | --- |
| `{Array, TypedArray}.prototype.{findLast, findLastIndex}` | 😐 es-x/no-array-prototype-findlast-findlastindex | 97 |
| `{Array, TypedArray}.prototype.toReversed` | 😐 es-x/no-array-prototype-toreversed | 110 |
| `{Array, TypedArray}.prototype.toSorted` | 😐 es-x/no-array-prototype-tosorted | 110 |
| `Array.prototype.toSpliced` | 😐 es-x/no-array-prototype-tospliced | 110 |
| `{Array, TypedArray}.prototype.with` | 😐 es-x/no-array-prototype-with | 110 |
| Hashbang Grammar | es-x/no-hashbang | 74 |
| Symbols as WeakMap keys | ❌ | 108 |
| RegExp Unicode property escapes (2023) | es-x/no-regexp-unicode-property-escapes-2023 | see issue #63 |

### ES2022

| Name                                         | ESLint / eslint-plugin-es                    | Chrome since  |
| -------------------------------------------- | -------------------------------------------- | ------------- |
| Arbitrary module namespace names             | es-x/no-arbitrary-module-namespace-names     | see issue #62 |
| `{Array, String, TypedArray}.prototype.at()` | 😐 es-x/no-array-string-prototype-at         | 92            |
| Class fields                                 | es-x/no-class-fields                         | 72, 74        |
| Class static initialization block            | es-x/no-class-static-block                   | 94            |
| Error `cause`                                | es-x/no-error-cause                          | 93            |
| `Object.hasOwn`                              | es-x/no-object-hasown                        | 93            |
| Private slot checks (`#x in obj`)            | es-x/no-private-in                           | 91            |
| RegExp match indices (`/d` flag)             | es-x/no-regexp-d-flag                        | 90            |
| RegExp Unicode property escapes (2022)       | es-x/no-regexp-unicode-property-escapes-2022 | see issue #63 |
| Top-level `await`                            | es-x/no-top-level-await                      | 89            |

### ES2021

| Name                                   | ESLint / eslint-plugin-es                    | Chrome since  |
| -------------------------------------- | -------------------------------------------- | ------------- |
| Logical Assignment \|\|=, \&\&=, ??=   | es/no-logical-assignment-operators           | 85            |
| Numeric separators                     | es/no-numeric-separators                     | 75            |
| `Promise.any`                          | es/no-promise-any                            | 85            |
| RegExp Unicode property escapes (2021) | es-x/no-regexp-unicode-property-escapes-2021 | see issue #63 |
| `String.prototype.replaceAll`          | 😐 no-restricted-properties                  | 85            |
| `WeakRef` and `FinalizationRegistry`   | es/no-weakrefs                               | 84            |

### ES2020

| Name                                   | ESLint / eslint-plugin-es                    | Chrome since  |
| -------------------------------------- | -------------------------------------------- | ------------- |
| `Atomics.{notify, wait}`               | no-restricted-properties                     | 68            |
| `BigInt`                               | es/no-bigint                                 | 67            |
| Dynamic `import()`                     | es/no-dynamic-import                         | 63            |
| `globalThis`                           | es/no-global-this                            | 71            |
| `import.meta`                          | es/no-import-meta                            | 64            |
| Module namespace exports               | es/no-export-ns-from                         | 72            |
| Nullish coalescing (`??`)              | es/no-nullish-coalescing-operators           | 80            |
| Optional chaining (`?.`)               | es/no-optional-chaining                      | 80            |
| `Promise.allSettled`                   | es/no-promise-all-settled                    | 76            |
| RegExp Unicode property escapes (2020) | es-x/no-regexp-unicode-property-escapes-2020 | see issue #63 |
| `String.prototype.matchAll`            | 😐 no-restricted-syntax                      | 73            |

### ES2019

| Name                                   | ESLint / eslint-plugin-es                    | Chrome since  |
| -------------------------------------- | -------------------------------------------- | ------------- |
| `Array.prototype.{flat, flatMap}`      | 😐 no-restricted-syntax                      | 69            |
| JSON superset                          | es/no-json-superset                          | 66            |
| `Object.fromEntries`                   | es/no-object-fromentries                     | 73            |
| Optional `catch` binding               | es/no-optional-catch-binding                 | 66            |
| RegExp Unicode property escapes (2019) | es-x/no-regexp-unicode-property-escapes-2019 | see issue #63 |
| Revised `Function.prototype.toString`  | ❌                                           |
| Stable `Array.prototype.sort`          | ❌                                           |
| `String.prototype.trimX` methods       | 😐 no-restricted-syntax                      | 66            |
| `Symbol.prototype.description`         | 👎 no-restricted-syntax                      | 70            |
| Well-formed `JSON.stringify`           | ❌                                           |

### ES2018

| Name                                   | ESLint / eslint-plugin-es             | Chrome since |
| -------------------------------------- | ------------------------------------- | ------------ |
| Async iteration (loop & generators)    | es/no-async-iteration                 | 63           |
| Object rest and spread operators       | es/no-rest-spread-properties          | 60           |
| `Promise.prototype.finally`            | 😐 no-restricted-syntax               | 63           |
| RegExp look-behind assertions          | es/no-regexp-lookbehind-assertions    | 62           |
| RegExp named capture groups            | es/no-regexp-named-capture-groups     | 64           |
| RegExp `/s` (dotAll) flag              | es/no-regexp-s-flag                   | 62           |
| RegExp Unicode property escapes (2018) | es/no-regexp-unicode-property-escapes | 64           |

### ES2017

| Name                                  | ESLint / eslint-plugin-es              | Chrome since |
| ------------------------------------- | -------------------------------------- | ------------ |
| Async functions                       | es/no-async-functions                  | 55           |
| Atomics                               | es/no-atomics                          | 68           |
| `Object.entries`                      | es/no-object-entries                   | 54           |
| `Object.getOwnPropertyDescriptors`    | es/no-object-getownpropertydescriptors | 54           |
| `Object.values`                       | es/no-object-values                    | 54           |
| SharedArrayBuffer                     | es/no-shared-array-buffer              | 68           |
| `String.prototype.{padStart, padEnd}` | 😐 no-restricted-syntax                | 57           |
| Trailing commas in parameter lists    | es/no-trailing-function-commas         | 58           |

### ES2016

| Name                       | ESLint / eslint-plugin-es   | Chrome since |
| -------------------------- | --------------------------- | ------------ |
| `Array.prototype.includes` | 😐 no-restricted-syntax     | 47           |
| Exponentiation operator    | es/no-exponential-operators | 52           |
