侧边栏壁纸
  • 累计撰写 218 篇文章
  • 累计创建 59 个标签
  • 累计收到 5 条评论

ArrayBuffer & TypedArray

barwe
2022-04-26 / 0 评论 / 0 点赞 / 818 阅读 / 977 字
温馨提示:
本文最后更新于 2022-04-29,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

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 对象差不多
0

评论区