What New ECMAScript Features Are Advancing to Stage 4 in 2023?
The article reviews recent TC39 decisions, detailing how proposals such as Hashbang Grammar, Duplicate Named Capturing Groups, Import Reflection, Function Memoization, Policy Maps and Sets, Symbol Predicates, and Object.pick/omit progressed through the ECMAScript staging process and what criteria each stage requires.
At the latest TC39 meeting, the Hashbang Grammar proposal reached Stage 4 and will become an official ECMAScript 2023 feature. Earlier Stage 2 proposals like Duplicate Named Capturing Groups and Import Reflection also moved forward, while Function Memoization, Object.pick/omit and other ideas entered Stage 1.
Stage 3 → Stage 4
Advancing from Stage 3 to Stage 4 requires:
Complete test262 tests for the proposal.
At least two implementations passing those tests and shipping in a release.
A pull request merging the proposal into the ECMA‑262 spec, approved by the ECMAScript editor.
Hashbang Grammar
Proposal: proposal‑hashbang
Hashbang (shebang) syntax (e.g., #!/usr/bin/env node) lets a script declare its interpreter. The proposal makes the shebang part of the source code visible to the engine instead of being stripped.
#!/usr/bin/env node
console.log("ecma");Running with Node:
$ node index.jsWith a shebang and executable permission, the script can be run directly:
$ ./index.js /usr/bin/envlocates the interpreter (e.g., node) on the system, avoiding hard‑coded paths.
Stage 2 → Stage 3
Advancing from Stage 2 to Stage 3 requires:
A draft spec text reviewed and signed by a TC39 member.
Signature from the ECMAScript editor.
Duplicate Named Capturing Groups
Proposal: proposal‑duplicate‑named‑capturing‑groups
Current named capture groups must have unique names, preventing their use in alternations such as
(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})|(?<day>\d{2})-(?<month>\d{2})-(?<year>\d{4}). The proposal allows non‑unique names to enable such patterns.
Stage 1 → Stage 2
Moving to Stage 2 requires a draft spec covering the entire proposal.
Import Reflection
Proposal: proposal‑import‑reflection
Extends import with a reflection type, e.g.:
import module x from "<specifier>";
const x = await import("<specifier>", { reflect: "module" });Used to annotate WebAssembly imports, allowing the engine to treat them as WebAssembly.Module or WebAssembly.Instance objects.
import module FooModule from "./foo.wasm";
FooModule instanceof WebAssembly.Module; // trueStage 0 → Stage 1
Requirements for Stage 0 to Stage 1:
Find a TC39 champion.
Define the problem, need, and a rough solution.
Provide examples.
Discuss API shape, algorithms, semantics, and implementation risks.
Symbol Predicates
Proposal: proposal‑symbol‑predicates
Introduces Symbol.isRegistered and Symbol.isWellKnown to test whether a Symbol is globally registered or a built‑in well‑known Symbol.
Policy Maps and Sets
Proposal: proposal‑policy‑map‑set
Adds native cache‑policy data structures (FIFO, LIFO, LRU, LFU) as built‑in Map/Set‑like objects:
new FIFOMap(maxEntries, entries = []);
new LRUSet(maxValues, values = []);
// etc.Function Memoization
Proposal: proposal‑function‑memo
Provides Function.prototype.memo to return a memoized version of a function:
function f(x) { console.log(x); return x * 2; }
const fMemo = f.memo();Also adds the @Function.memo decorator for concise syntax.
@Function.memo
function f(x) { console.log(x); return x * 2; }Allows custom cache objects implementing .get(), .has(), .set() to control memoization.
Object pick/omit
Proposal: proposal‑object‑pick‑or‑omit
Introduces Object.pick(obj, keysOrPredicate) and Object.omit(obj, keysOrPredicate) to extract or remove properties, similar to Lodash’s pick / omit but with native support for dynamic keys and prototype properties.
Object.pick(obj, ['job', 'sex']);
Object.omit(obj, ['name', 'age']);
Object.pick({a:1,b:2}, v => v===1); // => {a:1}Conclusion
The JavaScript Chinese Interest Group (JSCIG) invites developers to discuss these and other ECMAScript proposals on GitHub: https://github.com/JSCIG/es-discuss/discussions .
Signed-in readers can open the original source through BestHub's protected redirect.
This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactand we will review it promptly.
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.
