Change Array by Copy S4
中文标题:通过复制更改数组
- 阶段: Stage 4
- 状态: 已完成
- ECMAScript 版本: ES2023
- 同步时间: 2026年8月26日
- English original · 官方仓库
此提案为 Array.prototype 和 TypedArray.prototype 添加了非变异数组方法,例如 toReversed、toSorted、toSpliced 和 with,这些方法返回应用更改后的新副本。其目的是支持不可变风格的编程以及与元组的互操作性。
以下 README 来自上游仓库,其中的阶段或状态标注可能滞后;当前信息以提案概览为准。
通过复制更改数组
在 Array.prototype 和 TypedArray.prototype 上提供额外的方法,通过返回包含更改的新副本来实现对数组的更改。
状态
此提案目前处于阶段 4。
支持者
- Robin Ricard (Bloomberg)
- Ashley Claymore (Bloomberg)
审查者
概述
此提案为 Array.prototype 引入了以下函数属性:
Array.prototype.toReversed() -> ArrayArray.prototype.toSorted(compareFn) -> ArrayArray.prototype.toSpliced(start, deleteCount, ...items) -> ArrayArray.prototype.with(index, value) -> Array
所有这些方法都保持目标数组不变,并返回执行更改后其副本。
toReversed、toSorted 和 with 也将添加到类型化数组:
TypedArray.prototype.toReversed() -> TypedArrayTypedArray.prototype.toSorted(compareFn) -> TypedArrayTypedArray.prototype.with(index, value) -> TypedArray
这些方法随后将可在 TypedArray 的子类上使用。例如:
Int8ArrayUint8ArrayUint8ClampedArrayInt16ArrayUint16ArrayInt32ArrayUint32ArrayFloat32ArrayFloat64ArrayBigInt64ArrayBigUint64Array
示例
动机
Tuple.prototype 引入了这些函数作为处理 Record & Tuple 中元组不可变性的方式。虽然数组本质上不是不可变的,但这种编程风格可能对处理冻结数组的用户有益。
此提案尤其使得编写能够交替处理数组和元组的代码变得更加容易。
与 Record & Tuple 的关系
虽然此提案源自 Record & Tuple,但应独立推进。
如果 Web 兼容性要求如此,此提案中定义的属性名称将被更改。这些更改应反映在 Tuple.prototype 上。
实现
-
Firefox/SpiderMonkey,自 Firefox 115 起无需标志即可使用
-
Safari/JavaScriptCore,自 Safari 技术预览版 146 起无需标志即可使用
-
Chrome/V8,自 Chrome 110 起无需标志即可使用
-
Ladybird/LibJS,无需标志即可使用
-
./polyfill.js(极简参考实现)