ECMA 2023(ES14) 新特性

_zhiqiu發表於2024-05-22

ECMAScript 2023 主要包含內容

ECMAScript 2023 於 2023 年 6 月 27 日獲得 ECMA International 的批准。

ECMAScript 是標準化的 JavaScript 語言,於 1997 年釋出了第一版,現已發展成為世界上使用最廣泛的通用程式語言之一。

本 Ecma 標準定義了 ECMAScript 2023 Language,是 ECMAScript 語言規範的第 14 版。

從後向前遍歷陣列

它們的用法和find()findIndex()類似,唯一不同的是它們是 從後向前遍歷陣列,這兩個方法適用於陣列類陣列

  • findLast() 會返回第一個查詢到的元素,如果沒有找到,就會返回 undefined
  • findLastIndex() 會返回第一個查詢到的元素的索引。如果沒有找到,就會返回 -1;

示例:

const array = [{ value: 1 }, { value: 2 }, { value: 3 }, { value: 4 }];

array.find((n) => n.value % 2 === 1); // { value: 1 }
array.findIndex((n) => n.value % 2 === 1); // 0

// ======== proposal 之前 ===========

// find
[...array].reverse().find((n) => n.value % 2 === 1); // { value: 3 }

// findIndex
array.length - 1 - [...array].reverse().findIndex((n) => n.value % 2 === 1); // 2
array.length - 1 - [...array].reverse().findIndex((n) => n.value === 42); // should be -1, but 4

// ======== proposal 之後 ===========
// find
array.findLast((n) => n.value % 2 === 1); // { value: 3 }

// findIndex
array.findLastIndex((n) => n.value % 2 === 1); // 2
array.findLastIndex((n) => n.value === 42); // -1

Hashbang

此提案是為了匹配某些允許 Shebangs/Hashbang 的 CLI JS 主機中的實際用法。
目前,此類主機會剝離 hashbang,以便在傳遞給 JS 引擎之前生成有效的 JS 源文字。這會將剝離轉移到發動機上,它確實統一併標準化了剝離的方式。

示例:

#!/usr/bin/env node
// 在指令碼目標中
"use strict";
console.log(1);
#!/usr/bin/env node
// 在模組目標中
export {};
console.log(1);

使用 Symbol 作為 WeakMap

目前,WeakMap 僅允許使用物件作為鍵,這是 WeakMap 的一個限制。新功能擴充套件了 WeakMap API,允許使用唯一的 Symbol 作為鍵

示例:

const weak = new WeakMap();

// 使用符號使它成為一個更具意義的 key
const key = Symbol("my ref");
const someObject = {
    /* data data data */
};

weak.set(key, someObject);

使用複製的方法更改陣列內容

該提案在 Array.prototypeTypedArray.prototype 上提供了額外的方法,透過返回包含更改的新副本來啟用對陣列的更改。

該提案向 Array.prototype 引入了以下函式屬性:

  • Array.prototype.toReversed() -> Array
  • Array.prototype.toSorted(compareFn) -> Array
  • Array.prototype.toSpliced(start, deleteCount, ...items) -> Array
  • Array.prototype.with(index, value) -> Array

所有這些方法都保持目標陣列不變,並返回執行更改的副本。

toReversedtoSortedwith 也將被新增到 TypedArrays 中:

  • TypedArray.prototype.toReversed() -> TypedArray
  • TypedArray.prototype.toSorted(compareFn) -> TypedArray
  • TypedArray.prototype.with(index, value) -> TypedArray

示例:

const sequence = [1, 2, 3];
sequence.toReversed(); // => [3, 2, 1]
sequence; // => [1, 2, 3]

const outOfOrder = new Uint8Array([3, 1, 2]);
outOfOrder.toSorted(); // => Uint8Array [1, 2, 3]
outOfOrder; // => Uint8Array [3, 1, 2]

const correctionNeeded = [1, 1, 3];
correctionNeeded.with(1, 2); // => [1, 2, 3]
correctionNeeded; // => [1, 1, 3]

參考內容

  • tc39/proposal-array-find-from-last 提案。
  • tc39/proposal-hashbang 提案
  • tc39/proposal-symbols-as-weakmap-keys 提案
  • tc39/proposal-change-array-by-copy 提案
  • Ecma International 批准新標準