一个 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 子类
- Int8Array: 8位有符号整数(-128 到 127)
- Uint8Array: 8位无符号整数(0 到 255),超出范围的值会被取模
- Uint8ClampedArray: 8位无符号整数(0 到 255),超出范围的值会被钳制
- Int16Array: 16位有符号整数(-32768 到 32767)
- Uint16Array: 16位无符号整数(0 到 65535)
- Int32Array: 32位有符号整数(-2147483648 到 2147483647)
- Uint32Array: 32位无符号整数(0 到 4294967295)
- Float32Array: 32位浮点数
- Float64Array: 64位浮点数
- BigInt64Array: 64位有符号大整数
- BigUint64Array: 64位无符号大整数
静态属性
TypedArray.BYTES_PER_ELEMENT 属性代表了类型数组中每个元素所占用的字节数。
应用场景
- WebGL: 处理顶点数据和纹理
- Canvas: 处理图像像素数据
- Web Audio API: 处理音频数据
- WebSocket: 处理二进制数据
- 文件操作: 处理文件二进制内容
注意事项
- TypedArray 长度固定,创建后不能改变
- 不同TypedArray可以共享同一ArrayBuffer
- 处理大端序/小端序时需要注意平台差异
- 超出范围的值会被截断或取模
- 不能被冻结:不是空的 TypedArray 不能被冻结,因为它们的底层 ArrayBuffer 可以通过缓冲区的另一个 TypedArray 视图进行变化。这意味着对象将从不会真正地冻结。
- byteOffset 必须对齐:当将
TypedArray构建为ArrayBuffer的视图时,byteOffset参数必须与其元素大小对齐;换句话说,偏移量必须是BYTES_PER_ELEMENT的倍数。 - byteLength 必须对齐:类似于 byteOffset 参数,ArrayBuffer 传递给 TypedArray 构造函数的 byteLength 属性必须是构造函数 BYTES_PER_ELEMENT 的倍数。