【问题标题】:How do two unequal `Uint8Array`s influence each other when constructed from an `ArrayBuffer`?当从 `ArrayBuffer` 构造时,两个不相等的 `Uint8Array` 是如何相互影响的?
【发布时间】:2019-06-19 17:19:45
【问题描述】:

我有一个ArrayBuffer,我想从中获得两个单独的Uint8Array 副本。我尝试在ArrayBuffer 上使用Uint8Array 构造函数两次。构造的数组实例不相等。然而,当你改变一个时,它会以同样的方式改变另一个。这怎么可能,为什么会这样?

另一方面,如果您构造的Uint8Array 构造新的Uint8Arrays,它们将在功能上如预期的那样分开。

【问题讨论】:

  • 如果您可以缩短示例数组并将您正在使用的代码包含在Stack Snippet 中会更好,这允许使用console.log 来显示中间结果。
  • 但是为此,array1 === array2 正在做参考检查,并且由于 array1array2Uint8Array 类的不同实例,因此结果为 false。
  • 这就是重点!如果它们是不同的数组,当它们的内容发生变化时,它们如何相互影响?此功能通常仅在两个变量使用同一个实例时才会出现。
  • 因为它们引用了相同的缓冲区。
  • TypedArrays 很常见。见MDN's docs on the buffer property

标签: javascript arrays instance arraybuffer uint8array


【解决方案1】:

TypedArray 内部的条目实际上存储在底层缓冲区中,如果您获取/设置数组,它会从缓冲区读取/写入/写入。如果从另一个 TypedArray 创建 TypedArray,则会复制底层缓冲区,因此不会链接数组。

 array.buffer === array1.buffer // true
 array1.buffer === array2.buffer // false

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-30
    • 2014-08-04
    • 1970-01-01
    • 2014-08-04
    • 1970-01-01
    • 1970-01-01
    • 2012-06-27
    相关资源
    最近更新 更多