在类型化编程语言(JavaScript 属于这种语言)中,我们通常有固定声明类型的变量,可以动态赋值。
With Typed Arrays
事实恰恰相反。
您有固定的数据块(由ArrayBuffer
)您不能直接访问。相反,该数据是通过以下方式访问的:views。视图是在运行时创建的,它们有效地将缓冲区的某些部分声明为某种类型。这些视图是以下视图的子类ArrayBufferView
。视图将该数据块的特定连续部分定义为特定类型的数组的元素。一旦声明类型,浏览器就知道每个元素的长度和内容,以及此类元素的数量。有了这些知识,浏览器就可以更有效地访问各个元素。
因此,我们动态地将类型分配给实际上只是缓冲区的一部分。我们可以将多个视图分配给同一个缓冲区。
来自Specs https://www.khronos.org/registry/typedarray/specs/latest/:
Multiple typed array views can refer to the same ArrayBuffer, of different types,
lengths, and offsets.
This allows for complex data structures to be built up in the ArrayBuffer.
例如,给出以下代码:
// create an 8-byte ArrayBuffer
var b = new ArrayBuffer(8);
// create a view v1 referring to b, of type Int32, starting at
// the default byte index (0) and extending until the end of the buffer
var v1 = new Int32Array(b);
// create a view v2 referring to b, of type Uint8, starting at
// byte index 2 and extending until the end of the buffer
var v2 = new Uint8Array(b, 2);
// create a view v3 referring to b, of type Int16, starting at
// byte index 2 and having a length of 2
var v3 = new Int16Array(b, 2, 2);
The following buffer and view layout is created:
这定义了一个 8 字节缓冲区 b,以及该缓冲区的三个视图 v1、
v2 和 v3。每个视图都引用相同的缓冲区——所以 v1[0]
指字节 0..3 作为有符号 32 位整数,v2[0] 指字节
2 作为无符号 8 位整数,v3[0] 将字节 2..3 引用为
有符号 16 位整数。对一个视图的任何修改都会立即生效
其他可见:例如v2[0] = 0xff之后; v21 https://www.khronos.org/registry/typedarray/specs/latest/= 0xff;
那么 v3[0] == -1 (其中 -1 表示为 0xffff)。
因此,我们不是声明数据结构并用数据填充它们,而是获取数据并用不同的数据类型覆盖它。