JavaScript 类型化数组

1、类型化数组定义

JavaScript 类型化数组(typed array)是一种类似数组的对象,并提供了一种用于在内存缓冲区中访问原始二进制数据的机制

与普通数组的区别:

  1. 普通数组存储的对象可以动态的增加或减少,并且可以存储任意的 JavaScript
  2. 类型化数组中的每一个对象都是原始的二进制值,而二进制值采用多种支持的格式之一(从8位整数到64位浮点数)
  3. 不是所有适用于普通数组的方法都适用与类型化数组(如:push、pop)

2、类型化数组架构

为了达到最大的灵活性和效率,JavaScript 类型化数组将实现拆分为缓冲视图两部分。

  • 缓冲(由 ArrayBuffer 对象实现)描述的是一个数据分块,缓冲没有格式可言,并且不提供访问其内容的机制
  • 为了访问在缓冲对象中包含的内存,你需要使用视图。视图提供了上下文——即数据类型、起始偏移量和元素数——将数据转换为实际有类型的数组。

类型化数组架构

2.1、ArrayBuffer

ArrayBuffer 是一种数据类型,用来表示一个通用的固定长度二进制数据缓冲区

特点:

  1. 不能直接操作 ArrayBuffer 中的内容
  2. 需要创建一个类型化数组的视图或一个描述缓冲数据格式的 DataView,使用它们来读写缓冲区中的内容

2.2、类型化数组视图

类型化数组视图具有自描述性的名字和所有常用的数值类型像 Int8、Uint32、Float64 等等。

有一种特殊类型的数组 Uint8ClampedArray,它仅操作 0 到 255 之间的数值。(这对于 Canvas 数据处理非常有用)

类型值范围字节数描述对应的 Web LDL 类型等效的 C 类型
Int8Array-128~12718位有符号整数(补码)byteint8_t
Unit8Array0~25518位无符号整数octetunit8_t
Unit8ClampedArray0~25518位无符号整数(值会被裁剪)octetunit8_t
Int16Array-32768~32767216位有符号整数(补码)shortint16_t
Unit16Array0~65535216位无符号整数unsigned shortunit16_t
Int32Array-2147483648~2147483647432位有符号整数(补码)longint32_t
Unit32Array0~4294967295432位无符号整数unsigned longunit32_t
Float32Array-3.4E38~3.4E38 以及 1.2E-38(最小正数)432位 IEEE 浮点数(7位有效数字,例如:1.123456)unrestricted floatfloat
Float64Array-1.8E308~1.8E308 以及 5E324(最小正数)864位 IEEE 浮点数(16位有效数字,例如:1.123…15)unrestricted doubledouble
BigInt64Array-263~263-1864位有符号整数(补码)bigintint64_t(signed long long)
BigUnit64Array0~264-1864位无符号整数bigintunit64_t(unsigned long long)

2.3、DataView

DataView 是一种底层接口,它提供有可以操作缓冲区中任意数据的访问器(getter/setter)API。这对操作不同类型数据的场景很有帮助,例如:类型化数组视图都是运行在本地字节序模式(参考字节序),可以通过使用 DataView 来控制字节序。默认是大端字节序(Big-endian),但可以调用 getter / setter 方法改为小端字节序(Little-endian)。

3、类型化数组的 Web API

  1. FileReader.prototype.readAsArrayBuffer():读取对应的 Blob 或 File 的内容
  2. XMLHttpRequest.prototype.send():XMLHttpRequest 实例的 send() 方法现在支持使用类型化数组和 ArrayBuffer 对象作为参数
  3. ImageData.data:是一个 Uint8ClampedArray 对象,用来描述包含按照 RGBA 序列的颜色数据的一维数组,其值的范围在 0 到 255 之间

4、使用视图和缓冲

// 创建一个 16 字节固定长度的缓冲
const buffer = new ArrayBuffer(16);

// 判断数据的字节长度
if (buffer.byteLength === 16) {
  console.log("Yes"); // 执行,表示 buffer 的长度为16字节
} else {
  console.log("No");
}

// 创建一个视图——把缓冲内的数据格式化为一个 32 位有符号整数数组
const int32View = new Int32Array(buffer);
console.log(int32View); // Int32Array [0, 0, 0, 0]

// 向视图中填充数据
for (let i = 0; i < int32View.length; i++) {
  int32View[i] = i;
}
console.log(int32View); // Int32Array [0, 1, 2, 3]

// 可以在同一数据上创建多个视图,
const int16View = new Int16Array(buffer);
console.log(int16View); // Int16Array [0, 0, 1, 0, 2, 0, 3, 0]

5、转化为普通数组

// 第一种方法:Array.from()
const typedArray = new Uint8Array([1, 2, 3, 4]);
const normalArray = Array.from(typedArray);
console.log(normalArray); // Array [1, 2, 3, 4]

// 第二种方法:扩展运算符
const typedArray = new Uint8Array([1, 2, 3, 4]);
const normalArray = [...typedArray];
console.log(normalArray); // Array [1, 2, 3, 4]

// 第三种方法:数组原型方法
const typedArray = new Uint8Array([1, 2, 3, 4]);
const normalArray = Array.prototype.slice.call(typedArray);
console.log(normalArray); // Array [1, 2, 3, 4]
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jackson Mseven

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值