📜  JavaScript 中的 Atomics.compareExchange()

📅  最后修改于: 2022-05-13 01:58:10.101000             🧑  作者: Mango

JavaScript 中的 Atomics.compareExchange()

什么是原子?

  • Atomics 是 JavaScript 中的一个对象,它提供了将原子操作作为静态方法执行的能力。
  • 就像 JavaScript 中的 Math 对象一样,Atomics 的所有属性和方法也是静态的。
  • 原子与 SharedArrayBuffer(通用固定长度二进制数据缓冲区)对象一起使用。
  • 原子不是像其他全局对象那样的构造函数。
  • 原子不能与 new运算符一起使用,也不能作为函数调用。

JavaScript 中的原子操作
当有共享内存时,多个线程可以在内存中读取和写入相同的数据。为确保准确写入和读取预测值,除非当前操作完成,否则无法开始另一操作。原子操作也不能中断。

Atomics.compareExchange() 方法

  • 在原子操作中,有一个内置方法 Atomics.compareExchange() 用于在传递的参数等于数组中的旧值时交换数组特定位置的值。
  • JavaScript 中的 Atomics.compareExchange() 操作仅在传递的参数等于该位置的旧值时交换数组中的值。
  • Atomics.compareExchange() 操作返回驻留在数组该位置的旧值,无论它是否等于预期值。
  • 在修改的值被写回之前,不会发生其他写操作。

句法:

Atomics.compareExchange(typedArray, index, expectedValue, replacementValue)

使用的参数:

  • typedarray:它是您要修改的共享整数类型数组。
  • index:它是 typedArray 中要交换值的位置。
  • expectedValue :它是必须检查相等性的数字。
  • replacementValue :要交换的数字。

    返回值:

  • Atomics.compareExchange() 返回给定位置的旧值(typedArray[index])。

下面提供了上述函数的示例。

例子:

Input : arr[0] = 9;
        Atomics.compareExchange(arr, 0, 9, 5);
Output : 5
Input : arr[0] = 3; 
        Atomics.compareExchange(arr, 0, 3, 6);
Output : 6

下面提供了上述函数的代码。

代码 1:

javascript


javascript


javascript


输出 :

9
5

代码 2:

javascript


输出 :

3
6

    应用:

  • 每当我们想要交换(仅当传递的参数等于该值)数组的特定位置的值并且还想要返回数组该位置的旧值时,我们使用 Atomics.compareExchange() 操作在 JavaScript 中。

    让我们看一个 JavaScript 程序:

    javascript

    
    

    输出 :

    40
    20
    

例外:

  1. 如果 typedArray 不是允许的整数类型之一,那么 Atomics.compareExchange() 操作会抛出 TypeError。
  2. 如果 typedArray 不是共享类型数组,那么 Atomics.compareExchange() 操作会抛出 TypeError。
  3. 如果用作 Atomics.compareExchange() 操作的参数的索引在 typedArray 中超出范围,则 Atomics.compareExchange() 操作将引发 RangeError。

Atomics.compareExchange 和 Atomics.exchange 之间的区别
正如我们所读到的,JavaScript 中的 Atomics.compareExchange() 操作仅在传递的参数等于该位置的旧值时交换数组中的值,而 JavaScript 中的 Atomics.exchange() 操作交换并存储给定值数组中的给定位置,而不将其与位于数组该位置的旧值进行比较。
这两个操作都返回存在于指定位置的旧值。

支持的浏览器:

  • 谷歌浏览器
  • 微软边缘
  • 火狐