Skip to main content
These proposals are experimental. They may change significantly or be withdrawn entirely. Use them only for experimentation — not in production code unless you accept the risk of breaking changes.
These features require the core-js/full namespace (or explicit stage entry points) since they are not included in core-js/actual.
// Load all features including experimental proposals
import 'core-js/full';

// Or load a specific stage
import 'core-js/stage/2';   // Stage 2.7 + 2 + 3
import 'core-js/stage/1';   // Stage 1 + above
import 'core-js/stage/0';   // Stage 0 + above
import 'core-js/stage/pre'; // Pre-stage 0 + above

Stage 2.7

Iterator chunking

Proposal: tc39/proposal-iterator-chunking Adds Iterator.prototype.chunks and Iterator.prototype.windows for splitting iterators into fixed-size chunks.
import 'core-js/proposals/iterator-chunking-v2';

[1, 2, 3, 4, 5].values().chunks(2).toArray();
// => [[1, 2], [3, 4], [5]]

[1, 2, 3, 4, 5].values().windows(3).toArray();
// => [[1, 2, 3], [2, 3, 4], [3, 4, 5]]

**Entry points:**
core-js/proposals/iterator-chunking-v2 core-js(-pure)/actual|full/iterator/chunks core-js(-pure)/actual|full/iterator/windows

**Entry points:**
core-js/proposals/iterator-chunking core-js(-pure)/actual|full/iterator/chunks core-js(-pure)/actual|full/iterator/windows

## Stage 2

### AsyncIterator helpers

**Proposal:** [tc39/proposal-async-iterator-helpers](https://github.com/tc39/proposal-async-iterator-helpers)

```js
import 'core-js/proposals/async-iterator-helpers';

await AsyncIterator.from([1, 2, 3, 4, 5, 6, 7])
  .drop(1)
  .take(5)
  .filter(it => it % 2)
  .map(it => it ** 2)
  .toArray(); // => [9, 25]

await [1, 2, 3].values().toAsync().map(async it => it ** 2).toArray(); // => [1, 4, 9]
Entry points:
core-js/proposals/async-iterator-helpers
core-js(-pure)/actual|full/async-iterator

Iterator.range

Proposal: tc39/proposal-Number.range
import 'core-js/proposals/number-range';

for (const i of Iterator.range(1, 10)) {
  console.log(i); // => 1, 2, 3, 4, 5, 6, 7, 8, 9
}

for (const i of Iterator.range(1, 10, { step: 3, inclusive: true })) {
  console.log(i); // => 1, 4, 7, 10
}
Entry points:
core-js/proposals/number-range
core-js(-pure)/full/iterator/range

Array.isTemplateObject

import 'core-js/proposals/array-is-template-object';

Array.isTemplateObject((it => it)`qwe${ 123 }asd`); // => true

Number.prototype.clamp

import 'core-js/proposals/math-clamp-v2';

5.0.clamp(0, 10);   // => 5
-5.0.clamp(0, 10);  // => 0
15.0.clamp(0, 10);  // => 10

String.dedent

import 'core-js/proposals/string-dedent';

const message = 42;
console.log(String.dedent`
  print('${ message }')
`); // => print('42')

Symbol predicates

import 'core-js/proposals/symbol-predicates-v2';

Symbol.isRegisteredSymbol(Symbol.for('key')); // => true
Symbol.isRegisteredSymbol(Symbol('key'));      // => false
Symbol.isWellKnownSymbol(Symbol.iterator);    // => true
Symbol.isWellKnownSymbol(Symbol('key'));       // => false

Stage 1

Observable

import 'core-js/proposals/observable';

new Observable(observer => {
  observer.next('hello');
  observer.next('world');
  observer.complete();
}).subscribe({
  next(it) { console.log(it); },      // => 'hello', 'world'
  complete() { console.log('done'); },
});
Entry points:
core-js/proposals/observable
core-js(-pure)/full/observable
core-js(-pure)/full/symbol/observable

New collections methods

Adds functional methods (filter, map, reduce, find, every, some, etc.) to Set, Map, WeakSet, and WeakMap.
import 'core-js/proposals/collection-methods';

new Set([1, 2, 3, 4]).filter(it => it % 2); // => Set {1, 3}
new Map([['a', 1], ['b', 2]]).map(v => v * 2); // => Map { 'a' => 2, 'b' => 4 }
Also adds .of and .from static methods to collection constructors:
import 'core-js/proposals/collection-of-from';

Set.of(1, 2, 3);                          // => Set {1, 2, 3}
Map.from([['a', 1]], ([k, v]) => [k, v]); // => Map { 'a' => 1 }

compositeKey / compositeSymbol

import 'core-js/proposals/keys-composition';

const key = compositeKey({}, []);
const sym = compositeSymbol({}, []);
Entry points:
core-js/proposals/keys-composition
core-js(-pure)/full/composite-key
core-js(-pure)/full/composite-symbol

Number.fromString

import 'core-js/proposals/number-from-string';

Number.fromString('42');    // => 42
Number.fromString('ff', 16); // => 255

String.cooked

import 'core-js/proposals/string-cooked';

String.cooked`\u0041`; // => 'A'

String.prototype.codePoints

import 'core-js/proposals/string-code-points';

[...'abc'.codePoints()]; // => [{ codePoint: 97, position: 0 }, ...]

Stage 0

Function.prototype.demethodize

import 'core-js/proposals/function-demethodize';

const slice = Array.prototype.slice.demethodize();
slice([1, 2, 3], 1); // => [2, 3]

Function.isCallable / Function.isConstructor

import 'core-js/proposals/function-is-callable-is-constructor';

Function.isCallable(function () {});  // => true
Function.isCallable(() => {});        // => true
Function.isCallable(class {});        // => false
Function.isConstructor(class {});     // => true
Function.isConstructor(() => {});     // => false

Pre-stage 0

Reflect.metadata

import 'core-js/proposals/reflect-metadata';

const obj = {};
Reflect.defineMetadata('key', 'value', obj);
Reflect.getOwnMetadata('key', obj);   // => 'value'
Reflect.getOwnMetadataKeys(obj);      // => ['key']
Entry points:
core-js/proposals/reflect-metadata
core-js(-pure)/full/reflect/define-metadata
core-js(-pure)/full/reflect/get-metadata
core-js(-pure)/full/reflect/has-metadata
core-js(-pure)/full/reflect/metadata

Build docs developers (and LLMs) love