📅  最后修改于: 2023-12-03 15:01:36.899000             🧑  作者: Mango
JavaScript Atomics是一个用于进行原子操作(atomic operations)的 API。原子操作指的是不可被中断的操作,也就是说在操作过程中不会被其他操作所干扰。
其中,Atomics.compareExchange()方法是用于将一个数组中的一个位置与期望值进行比较,如果相等则将该位置的值更改为新值,并返回操作之前该位置的值。
Atomics.compareExchange(typedArray, index, expectedValue, replacementValue)
| 参数 | 描述 |
| ----------------- | ------------------------------------------------------------ |
| typedArray
| 必须。表示需要进行原子操作的固定长度的数组,例如 Int8Array
、Uint8Array
、Int16Array
等等。 |
| index
| 必须。表示需要进行检查的索引值。 |
| expectedValue
| 必须。表示期望该位置的值为该值,如果实际值与期望值不符,则该位置的值不会修改,返回操作之前该位置的值。 |
| replacementValue
| 必须。表示在期望值与实际值相等时要设置的新值。 |
该方法返回操作之前该位置的值。
const buffer = new SharedArrayBuffer(4);
const int8View = new Int8Array(buffer);
int8View[0] = 1;
console.log(Atomics.compareExchange(int8View, 0, 1, 2)); // 返回 1
console.log(int8View[0]); // 输出 2,即更改了该位置的值
console.log(Atomics.compareExchange(int8View, 0, 1, 3)); // 返回 2
console.log(int8View[0]); // 输出 2,该位置的值并未更改
在上述示例中,我们创建了一个长度为4的共享内存(SharedArrayBuffer
),并将其转换为Int8Array
类型。随后我们将数组中的第一个位置设置为1,接着使用Atomics.compareExchange()
方法来比较该位置的值与期望值1。由于该位置的值实际上就是1,所以该方法会返回1并将该位置的值更改为2。接着我们再次使用该方法,期望该位置的值为1,实际上该位置的值已经变成了2,所以该方法会返回2且不会修改该位置的值。
typedArray
必须为固定长度的数组。使用任何其他类型的数组会抛出异常。index
必须为整数。使用任何其他类型的值会被转换为整数类型。expectedValue
和replacementValue
的类型应该与typedArray
类型匹配,否则可能发生不可预料的错误。