JavaScript 中的 TypedArray
本文解释了 JavaScript 中的 TypedArray。
我们将详细解释TypedArray的基本概念、每种类型的定义、使用方法以及具体的使用场景。
YouTube Video
JavaScript 中的 TypedArray
JavaScript 中的 TypedArray 是一种用来高效处理缓冲二进制数据的对象。TypedArray 根据特定的数据类型分配和操作内存。与普通数组不同,TypedArray 只能存储固定大小的二进制数据,而非任意数据类型。
TypedArray 的基本结构
TypedArray 的主要组成部分是 ArrayBuffer 和 TypedArray 本身。
- ArrayBuffer:一个固定大小的缓冲区,用于在内存中分配二进制数据。此缓冲区仅作为一个数据区域,无法直接读取或写入。
- TypedArray:一个包装对象,应用特定的数据类型到缓冲区,使得数据得以访问和操作。
基本使用示例
以下是一个创建 ArrayBuffer 并基于它创建 TypedArray 的示例。
1// Create a 16-byte buffer
2const buffer = new ArrayBuffer(16);
3
4// Create a TypedArray (Uint8Array) to handle 8-bit unsigned integers
5const uint8Array = new Uint8Array(buffer);
6
7// Set data
8uint8Array[0] = 255;
9uint8Array[1] = 128;
10
11// Retrieve data
12console.log(uint8Array[0]); // 255
13console.log(uint8Array[1]); // 128
- 在此示例中,创建了一个
ArrayBuffer,然后基于该缓冲区创建了一个Uint8Array。每个元素被视为一个 8 位无符号整数,只能存储规定范围内的值。
TypedArray 的类型
针对每种数据类型都有不同的 TypedArray。主要的类型如下。
| 类型名称 | 元素的大小 | 描述 |
|---|---|---|
Int8Array |
1字节 | 8位有符号整数 |
Uint8Array |
1字节 | 8位无符号整数 |
Uint8ClampedArray |
1字节 | 8位无符号整数(保存限制值) |
Int16Array |
2字节 | 16位有符号整数 |
Uint16Array |
2字节 | 16位无符号整数 |
Int32Array |
4字节 | 32位有符号整数 |
Uint32Array |
4字节 | 32位无符号整数 |
Float32Array |
4字节 | 32位浮点数 |
Float64Array |
8字节 | 64位浮点数 |
这些 TypedArray 都具有内存高效的特点,并能够有效处理大量数据。
操作 TypedArray
您可以像普通数组一样使用索引访问 TypedArray 中的数据,同时还提供了一些特殊方法。
设置值
在 TypedArray 中,您可以使用 set 方法一次性分配多个值。
1const buffer = new ArrayBuffer(8);
2const int16Array = new Int16Array(buffer);
3
4// Set values
5int16Array.set([10, 20, 30]);
6
7console.log(int16Array[0]); // 10
8console.log(int16Array[1]); // 20
9console.log(int16Array[2]); // 30
- 此代码使用
set方法一次性为Int16Array分配多个值,并在控制台中显示每个元素。
获取子数组
要获取 TypedArray 的一部分作为子数组,可以使用 subarray 方法。这与原始 TypedArray 引用相同的缓冲区。
1const int16Array = new Int16Array([1, 2, 3, 4, 5]);
2
3// Get a subarray containing elements from the 2nd to the 4th
4const subArray = int16Array.subarray(1, 4);
5
6console.log(subArray); // Int16Array [2, 3, 4]
- 此代码使用
subarray方法从Int16Array中获取指定范围的元素,并在控制台中显示该子数组。
复制缓冲区
TypedArray 的缓冲区还可以复制到另一个 TypedArray。使用 set 方法,您可以从指定位置开始复制。
1const srcArray = new Uint8Array([10, 20, 30, 40]);
2const destArray = new Uint8Array(4);
3
4// Copy
5destArray.set(srcArray);
6
7console.log(destArray); // Uint8Array [10, 20, 30, 40]
- 此代码使用
set方法将Uint8Array的内容复制到另一个数组,并在控制台中显示复制的数组。
使用 DataView
虽然 TypedArray 使用固定的数据类型处理缓冲区,DataView 是一个接口,允许以任意偏移量和数据类型灵活操作二进制数据。这样可以在同一个缓冲区中混合使用不同的数据类型。
1const buffer = new ArrayBuffer(8);
2const dataView = new DataView(buffer);
3
4// Write a 32-bit signed integer at offset 0
5dataView.setInt32(0, 12345);
6
7// Write a 32-bit floating-point number at offset 4
8dataView.setFloat32(4, 12.34);
9
10console.log(dataView.getInt32(0)); // 12345
11console.log(dataView.getFloat32(4)); // 12.34000015258789
-
此代码使用
DataView在同一个缓冲区上写入不同类型的数据——32位整数和32位浮点数,并检查结果。 -
DataView比TypedArray提供了更大的数据访问灵活性,在处理二进制格式文件或网络协议时特别有用。
TypedArray 的使用场景
TypedArray 主要用于高效处理大量的二进制数据。具体使用场景包括以下内容。
图像处理
TypedArray 通常用于操作图像数据的像素信息。使用 Uint8Array,可以存储每个像素的 RGBA 值,并进行图像编辑和处理。
1const width = 100;
2const height = 100;
3const imageData = new Uint8Array(width * height * 4); // RGBA
4
5// Set pixel data
6for (let i = 0; i < imageData.length; i += 4) {
7 imageData[i] = 255; // Red
8 imageData[i + 1] = 0; // Green
9 imageData[i + 2] = 0; // Blue
10 imageData[i + 3] = 255; // Alpha
11}- 此代码使用
Uint8Array以RGBA格式创建宽度为100、高度为100的图像数据,并将所有像素设置为红色。
与 WebAssembly 进行交互
TypedArray 用于在 JavaScript 和 WebAssembly 之间交换二进制数据。通过 ArrayBuffer 共享 JavaScript 和 WebAssembly 的内存空间,可以实现快速数据交换。
处理音频和视频数据
TypedArray 在处理音频和视频中起着重要作用。可以将音频数据的波形存储在 Float32Array 中以进行播放和处理。
结论
TypedArray 是有效处理大量二进制数据的强大工具。在图像处理、WebAssembly 和音频/视频数据处理等对性能要求很高的应用中,它尤其有用。TypedArray 的 API 与普通数组类似,但在内存使用和数据类型方面存在限制,因此需要正确区分使用。
您可以在我们的YouTube频道上使用Visual Studio Code跟随上述文章进行学习。 请也查看我们的YouTube频道。