TypedArray

86 阅读3分钟

一个 TypedArray 对象描述了底层二进制数据缓冲区的类数组视图。

没有称为 TypedArray 的全局属性,也没有直接可用的 TypedArray 构造函数。

%TypedArray%是一个“抽象类”,为所有类型化数组子类提供一个公共的实用方法接口。

ArrayBuffer

ArrayBuffer 对象用来表示通用的原始二进制数据缓冲区。

ArrayBuffer 是一个可转移对象。

可转移的对象(Transferable object)是拥有属于自己的资源的对象,这些资源可以从一个上下文转移到另一个,确保资源一次仅在一个上下文可用。传输后,原始对象不再可用;它不再指向转移后的资源,并且任何读取或者写入该对象的尝试都将抛出异常。

分离的缓冲区具有以下行为:

byteLength 变为 0(在缓冲区和关联的类型化数组视图中)。

所有实例方法,比如 resize() 和 slice(),会在调用时抛出 TypeError。关联的类型化数组视图的方法也会抛出 TypeError。

ArrayBuffer 实例的 detached 访问器属性返回一个布尔值,指示该缓冲区是否已经分离(传输)。

语法:new ArrayBuffer(length, options)

  • length:要创建的数组缓冲区的大小(以字节为单位)。

  • options 可选:一个对象,可以包含以下属性:

    • maxByteLength 可选:数组缓冲区可以调整到的最大大小,以字节为单位。

TypedArray 子类

  1. Int8Array: 8位有符号整数(-128 到 127)
  2. Uint8Array: 8位无符号整数(0 到 255),超出范围的值会被取模
  3. Uint8ClampedArray: 8位无符号整数(0 到 255),超出范围的值会被钳制
  4. Int16Array: 16位有符号整数(-32768 到 32767)
  5. Uint16Array: 16位无符号整数(0 到 65535)
  6. Int32Array: 32位有符号整数(-2147483648 到 2147483647)
  7. Uint32Array: 32位无符号整数(0 到 4294967295)
  8. Float32Array: 32位浮点数
  9. Float64Array: 64位浮点数
  10. BigInt64Array: 64位有符号大整数
  11. BigUint64Array: 64位无符号大整数

静态属性

TypedArray.BYTES_PER_ELEMENT 属性代表了类型数组中每个元素所占用的字节数。

应用场景

  1. WebGL: 处理顶点数据和纹理
  2. Canvas: 处理图像像素数据
  3. Web Audio API: 处理音频数据
  4. WebSocket: 处理二进制数据
  5. 文件操作: 处理文件二进制内容

注意事项

  1. TypedArray 长度固定,创建后不能改变
  2. 不同TypedArray可以共享同一ArrayBuffer
  3. 处理大端序/小端序时需要注意平台差异
  4. 超出范围的值会被截断或取模
  5. 不能被冻结:不是空的 TypedArray 不能被冻结,因为它们的底层 ArrayBuffer 可以通过缓冲区的另一个 TypedArray 视图进行变化。这意味着对象将从不会真正地冻结。
  6. byteOffset 必须对齐:当将 TypedArray 构建为 ArrayBuffer 的视图时,byteOffset 参数必须与其元素大小对齐;换句话说,偏移量必须是 BYTES_PER_ELEMENT 的倍数。
  7. byteLength 必须对齐:类似于 byteOffset 参数,ArrayBuffer 传递给 TypedArray 构造函数的 byteLength 属性必须是构造函数 BYTES_PER_ELEMENT 的倍数。