Array.prototype.with()
Baseline 2023
Newly available
Since July 2023, this feature works across the latest devices and browser versions. This feature might not work in older devices or browsers.
语法
js
arrayInstance.with(index, value)
参数
index
-
要修改的数组索引(从 0 开始),将会转换为整数。
- 负数索引会从数组末尾开始计数——即当
index < 0
时,会使用index + array.length
。 - 如果规范化后的索引超出数组边界,会抛出
RangeError
。
- 负数索引会从数组末尾开始计数——即当
value
-
要分配给指定索引的任何值。
返回值
一个全新的数组,其中 index
索引处的元素被替换为 value
。
异常
RangeError
-
index > array.length
或index < -array.length
时抛出。
描述
示例
创建一个新的数组,改变其中一个元素
js
const arr = [1, 2, 3, 4, 5];
console.log(arr.with(2, 6)); // [1, 2, 6, 4, 5]
console.log(arr); // [1, 2, 3, 4, 5]
数组方法的链式调用
使用 with()
方法,你可以在更新一个数组元素后继续调用其他的数组方法。
js
const arr = [1, 2, 3, 4, 5];
console.log(arr.with(2, 6).map((x) => x ** 2)); // [1, 4, 36, 16, 25]
在稀疏数组上使用 with()
with()
方法总会创建一个密集数组。
js
const arr = [1, , 3, 4, , 6];
console.log(arr.with(0, 2)); // [2, undefined, 3, 4, undefined, 6]
在非数组对象上调用 with()
with()
方法创建并返回一个新数组。它读取 this
的 length
属性,然后访问其键是小于 length
的非负整数的每个属性。当 this
的每个属性被访问后,索引等于该属性的键的数组元素被设置为该属性的值。最后,将 index
的数组值设置为 value
。
js
const arrayLike = {
length: 3,
unrelated: "foo",
0: 5,
2: 4,
3: 3, // 由于 length 属性的值为 3,with() 会忽略该值
};
console.log(Array.prototype.with.call(arrayLike, 0, 1));
// [ 1, undefined, 4 ]
规范
Specification |
---|
ECMAScript Language Specification # sec-array.prototype.with |
浏览器兼容性
BCD tables only load in the browser