ArrayBuffer
ArrayBuffer 是 JS 内置的全局构造方法。首先它实例化的对象是一个普通的 JS 对象,保存在堆中,可以进行普通的属性存取。然后它绑定了一块内存区域,这块区域被分配给了 ArrayBuffer 对象,用来存放字节序列。
有趣的是,ArrayBuffer 对象本身并不能操纵它绑定的字节存储区域,因为没有为这块区域声明类型,ArrayBuffer 对象不能自己完成对字节序列的编码和解码。
const buf = new ArrayBuffer(10)
buf[0] = 'barwe'
对 ArrayBuffer 对象属性的直接存取操作实际上是在该对象的堆上进行的,这与普通的 JS 对象并无不同,它并不会将数据保存到 ArrayBuffer 对象绑定的字节存储区域中。
要想操纵 ArrayBuffer 对象绑定的字节序列存储区域,需要为它先声明一个类型,比如存的如果是 Int8 类型,则应该解码出来的是单字节有符号的整数,如果是 Uint8 类型,则解码出来的是单字节的无符号整数。相同的字节序列使用不同的类型去解码,会获取截然不同的序列。
对字节序列存储区域的类型声明一般通过 类型化数组 (TypedArray) 完成。
TypedArray
类型化数组并不是 JS 内置的全局构造函数,TypedArray 代表的是一系列指明具体类型的构造方法。ECMA2015 引入的 TypedArray 有:Int8Array
, Uint8Array
, Uint8ClampedArray
, Int16Array
, Uint16Array
, Int32Array
, Uint32Array
, Float32Array
, Float64Array
, BigInt64Array
, BigUint64Array
。
可以从字节长度、已有的类型化数组或者 ArrayBuffer 对象构造类型化数组。
TypedArray 提供了一些静态属性和方法:
BYTES_PER_ELEMENT
每个元素占据的字节数,乘以数组长度等于数组占据的字节数name
构造函数的名称,例如Int8Array
TypedArray 实例提供了一些实例属性和方法:
buffer
绑定的 ArrayBuffer 对象,只读byteLength
类型化数组占据的字节长度byteOffset
读取 ArrayBuffer 时的字节偏移量length
类型化数组的长度- 实例方法与 Array 对象差不多
评论区