JavaScript - TypedArray 对象

你好,未来的编程巨星们!? 今天,我们将踏上一段激动人心的旅程,探索 JavaScript 中的 TypedArrays。如果你是编程新手,不用担心——我会成为你的友好向导,我们会一步步来。所以,拿起你最喜欢的饮料,舒服地坐好,让我们开始吧!

JavaScript - TypedArray

什么是 TypedArray?

想象你在组织一个大派对(因为谁不喜欢一个好的派对呢?)。你需要跟踪你有多少杯子、盘子和餐具。这就是 JavaScript 中的 TypedArray 做的事情——它帮助我们高效地组织和存储特定类型的数据。

TypedArray 是 JavaScript 中的一种特殊数组,只能包含特定类型的数字。这就像为你的叉子、勺子和刀子分别准备不同的盒子,而不是把它们全部扔进一个大抽屉。

// 创建一个包含 8 位整数的 TypedArray
const myArray = new Int8Array(5);
console.log(myArray); // 输出: Int8Array(5) [0, 0, 0, 0, 0]

在这个例子中,我们创建了一个可以容纳五个 8 位整数的 TypedArray。这就像设置了五个小盒子,每个盒子都能容纳一个介于 -128 和 127 之间的数字。

为什么使用 TypedArray?

你可能会想,“我们已经有普通数组了,为什么还要麻烦用 TypedArrays?”问得好!TypedArrays 有一些超级能力,使它们在特定情况下非常完美:

  1. 速度:它们在数值操作上更快。
  2. 内存效率:它们使用固定数量的内存。
  3. 兼容性:它们与二进制数据和其他语言配合得很好。

这就好比使用一种专用工具而不是瑞士军刀——有时,你需要那个完美的匹配!

TypedArray 对象

JavaScript 提供了多种类型的 TypedArrays,每种都设计用于不同的数字类型和大小。让我们用一张整齐的表格来看一下:

TypedArray 描述 范围
Int8Array 8位有符号整数 -128 到 127
Uint8Array 8位无符号整数 0 到 255
Int16Array 16位有符号整数 -32,768 到 32,767
Uint16Array 16位无符号整数 0 到 65,535
Int32Array 32位有符号整数 -2,147,483,648 到 2,147,483,647
Uint32Array 32位无符号整数 0 到 4,294,967,295
Float32Array 32位浮点数 约1.2E-38 到 约3.4E+38
Float64Array 64位浮点数 约5.0E-324 到 约1.8E+308

哇,这真是一长串!如果这看起来令人不知所措,别担心——我们会用例子来让这一切都清晰起来。

TypedArray 属性

TypedArrays附带一些方便的属性。让我们来探索它们:

1. length

这告诉我们我们的 TypedArray 中有多少个元素。

const myArray = new Int16Array(3);
console.log(myArray.length); // 输出: 3

2. BYTES_PER_ELEMENT

这个属性告诉我们数组中的每个元素占据多少字节。

console.log(Int8Array.BYTES_PER_ELEMENT); // 输出: 1
console.log(Int16Array.BYTES_PER_ELEMENT); // 输出: 2

这就好比知道我们的存储系统中每个盒子有多大!

TypedArray 静态方法

TypedArrays附带一些我们可以不创建实例就使用的方法。让我们来看两个:

1. TypedArray.from()

这个方法从一个类数组对象创建一个新的 TypedArray。

const regularArray = [1, 2, 3, 4];
const typedArray = Int8Array.from(regularArray);
console.log(typedArray); // 输出: Int8Array(4) [1, 2, 3, 4]

这就好比把我们的混合餐具抽屉转换成整齐的盒子!

2. TypedArray.of()

这个方法创建一个新的 TypedArray,带有可变数量的参数。

const myArray = Int16Array.of(1, 2, 3, 4, 5);
console.log(myArray); // 输出: Int16Array(5) [1, 2, 3, 4, 5]

这就好比说,“这里有物品,请为我组织它们!”

TypedArray 实例方法

现在,让我们看看我们可以在我们的 TypedArray 实例上使用的一些方法:

1. set()

这个方法允许我们将值复制到我们的 TypedArray 中。

const myArray = new Int8Array(5);
myArray.set([1, 2, 3]);
console.log(myArray); // 输出: Int8Array(5) [1, 2, 3, 0, 0]

这就好比把物品放到我们组织好的盒子里。

2. subarray()

这个方法返回一个新的 TypedArray,它是原始数组的一部分。

const originalArray = new Int8Array([1, 2, 3, 4, 5]);
const subArray = originalArray.subarray(1, 4);
console.log(subArray); // 输出: Int8Array(3) [2, 3, 4]

这就好比从我们的存储系统中取出几个盒子用于特定任务。

示例

让我们把这些知识结合起来,用一些实际的示例!

示例 1:创建和修改一个 TypedArray

// 创建一个包含 8 位无符号整数的 TypedArray
const pixelData = new Uint8Array(4);

// 设置一个像素的 RGB 值(红色: 255,绿色: 128,蓝色: 64,透明度: 255)
pixelData[0] = 255; // 红色
pixelData[1] = 128; // 绿色
pixelData[2] = 64;  // 蓝色
pixelData[3] = 255; // 透明度(完全不透明)

console.log(pixelData); // 输出: Uint8Array(4) [255, 128, 64, 255]

在这个示例中,我们使用 Uint8Array 来表示一个像素的颜色值。每个值都在 0 到 255 之间,非常适合 8 位无符号整数!

示例 2:使用 TypedArrays 提高性能

const size = 1000000;

// 使用普通数组
console.time('Regular Array');
const regularArray = new Array(size);
for (let i = 0; i < size; i++) {
regularArray[i] = i;
}
console.timeEnd('Regular Array');

// 使用 TypedArray
console.time('TypedArray');
const typedArray = new Int32Array(size);
for (let i = 0; i < size; i++) {
typedArray[i] = i;
}
console.timeEnd('TypedArray');

运行这段代码,你可能会发现 TypedArray 更快!这就好比有一个组织良好的存储系统,而不是把所有东西扔进一个大堆。

就这样,朋友们!我们已经穿越了 TypedArrays 的领域,从理解它们是什么到看到它们在实际中的应用。记住,熟能生巧,所以不要害怕尝试这些概念。

在你意识到之前,你将变成 TypedArray 的魔法师,优化你的代码,并给你的开发伙伴留下深刻印象。下次见,快乐编码!??‍??‍?

Credits: Image by storyset