JavaScript 提供了 8 种类型化数组(Typed Arrays)类型:
Int8Array
8 位有符号整数数组Int16Array
16 位有符号整数数组Int32Array
32 位有符号整数数组Uint8Array
8 位无符号整数数组Uint16Array
16 位无符号整数数组Uint32Array
32 位无符号整数数组Float32Array
32 位浮点数数组Float64Array
64 位浮点数数组Uint8ClampedArray
8 位无符号整型固定数组BigInt64Array
64 位有符号整数数组BigUint64Array
64 位无符号整型数组
它们都是 ArrayBufferView
实例。
类型化数组本质上是 ArrayBuffer
的视图,其中每个项都具有相同的大小和类型。
DataView
是 ArrayBuffer
的另一个视图,但在这种情况下,数组中的项可以具有不同的大小和类型。
下面是一个如何创建 8 位有符号整数数组的示例:
const a = new Int8Array()
您可以预先分配 n 个字节:
const bytes = 1024
const a = new Int8Array(bytes)
它的主要用途是允许查看 ArrayBuffer,它本身是不透明的(我们无法检查其内容)。
以下是我们的做法:
const a = new Int8Array(buffer)
这些类型化数组类似于数组,因此现在我们可以通过常用的数组访问技术检查缓冲区的内容,并且我们可以访问许多方法和属性,包括 map()
、reduce()
等等。
类型化数组的主要用例是与 WebGL、Web Audio 或 Canvas API 一起使用。一些 WebGL 函数需要类型化数组,因为它们比常规 JavaScript 数组的性能更好。
需要记住的一点是,类型化数组不允许我们控制字节顺序:它使用平台的字节顺序。一般来说,这很好,因为我们所说的主要用例是使用一个多媒体 API 在本地使用数组。此外,大多数消费类计算机使用小字节序(Little-Endian),因为 Intel 使用这种约定。但是,如果您在使用大字节序(Big-Endian) 的系统上传输类型化数组的数据,则数据可能编码错误,因此无效。
如果您需要这种对字节顺序的控制,请改用 DataView。