📜  TypedArray介绍(1)

📅  最后修改于: 2023-12-03 14:48:03.982000             🧑  作者: Mango

TypedArray介绍

在JavaScript中,我们可以使用数组来存储和操作一系列的值。然而,在一些特定场景下,我们需要操作的数据需要按照一定规则存储,比如连续内存块中存储的数字或其他类型的数据,这时候普通的JavaScript数组就不太适用了。而这正是javascript中的TypedArray存在的意义。

TypedArray是什么

TypedArray是ES6引入的一种新的数组类型,它是由一组内容相同的固定尺寸的数据块组成,这些数据块通常存储在连续内存区域中。TypedArray可以让我们以特定内存布局来读取和操作独立的数据元素,可以处理海量数据的浏览器应用。

TypedArray包括Uint8Array, Int8Array, Uint16Array, Int16Array, Uint32Array, Int32Array, Float32Array和Float64Array等8个类型数组,每个类型对应着不同的字节数。

以下是每个类型数组对应的字节数和范围:

| TypedArray类型 | 字节数 | 存储范围 | | -------------- | ------ | ---------------- | | Int8Array | 1 | -128 到 127 | | Uint8Array | 1 | 0 到 255 | | Int16Array | 2 | -32768 到 32767 | | Uint16Array | 2 | 0 到 65535 | | Int32Array | 4 | -2147483648 到 2147483647 | | Uint32Array | 4 | 0 到 4294967295 | | Float32Array | 4 | 单精度浮点数 | | Float64Array | 8 | 双精度浮点数 |

TypedArray的应用

TypedArray主要用于处理原始的二进制数据或其他类型的数据,如声音、视频、图像和网络数据等。下面就举几个使用TypedArray的例子:

1. 对音频的采样数据进行处理

假设我们已经获取了一段音频的采样数据,可以使用TypedArray来表示这些二进制数据。例如,可以创建一个Int16Array类型的数组存储这些采样数据:

const audioData = new Int16Array(audioBuffer.getChannelData(0).length);
for (let i = 0; i < audioData.length; i++) {
  audioData[i] = Math.sin(Math.PI * i / 16) * 32767;  // 模拟音频数据,不要在实际场景中使用
}

上面的代码使用了Math.sin函数生成了一个简单的音频波形,这里只是为了演示TypedArray的应用,实际中的音频数据需要根据实际场景获取。

2. 使用DataView读写网络数据包

网络数据包通常是按照一定的协议进行封包和解包的,可以使用DataView来读写这些二进制数据。例如,对于一个HTTP请求报文:

GET / HTTP/1.1\r\n\r\n

可以使用以下代码将其转换为一个Uint8Array类型的数组:

const request = 'GET / HTTP/1.1\r\n\r\n';
const requestData = new Uint8Array(request.length);
for (let i = 0; i < request.length; i++) {
  requestData[i] = request.charCodeAt(i);
}

具体的转换过程可以使用DataView来实现,这里不再赘述。

3. 对图像像素数据进行处理

通常情况下,图像像素数据是以RGBA或ARGB等格式存储的,可以使用TypedArray的Uint8ClampedArray类型来方便地读写像素值:

const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
const pixels = new Uint8ClampedArray(imageData.data);

for (let i = 0; i < pixels.length; i += 4) {
  // 反转R、G、B通道
  pixels[i] = 255 - pixels[i];
  pixels[i + 1] = 255 - pixels[i + 1];
  pixels[i + 2] = 255 - pixels[i + 2];
}

ctx.putImageData(new ImageData(pixels, imageData.width, imageData.height), 0, 0);

上面的代码将图像的RGB通道值反转后重新绘制了原来的图像。

Summary

TypedArray提供了一种高效的方式来操作大量二进制数据,可以用于许多场景,如音频、视频、图像、网络数据、通信协议等。因为它能够以特定内存布局来读取和操作独立的数据元素,因此在大数据处理场景下性能要远高于普通的JavaScript数组。

TypedArray的应用场景有很多,上面只是提供了几个简单的示例,还有很多其他的应用场景需要探索。在实际使用时需要注意数组类型和字节数的选择,以确保数据的正确性和存储效率。