ArrayBuffer详解

ArrayBuffer是所有定型数组及视图引用的基本单位。Float32Array实际上是一种“视图”,可以允许JavaScript运行时访问一块名为ArrayBuffer的预分配内存。

注意 SharedArrayBuffer是ArrayBuffer的一个变体,可以无须复制就在执行上下文间传递它。

ArrayBuffer()是一个普通的JavaScript构造函数,可用于在内存中分配特定数量的字节空间。

const buf = new ArrayBuffer(16);   // 在内存中分配16 字节
alert(buf.byteLength);               // 16

ArrayBuffer一经创建就不能再调整大小。不过,可以使用slice()复制其全部或部分到一个新实例中:

const buf1 = new ArrayBuffer(16);
const buf2 = buf1.slice(4, 12);
alert(buf2.byteLength);   // 8

第一种允许你读写ArrayBuffer的视图是DataView。这个视图专为文件I/O和网络I/O设计,其API支持对缓冲数据的高度控制,但相比于其他类型的视图性能也差一些。DataView对缓冲内容没有任何预设,也不能迭代。

必须在对已有的ArrayBuffer读取或写入时才能创建DataView实例。这个实例可以使用全部或部分ArrayBuffer,且维护着对该缓冲实例的引用,以及视图在缓冲中开始的位置。

const buf = new ArrayBuffer(16);
// DataView默认使用整个ArrayBuffer
const fullDataView = new DataView(buf);
alert(fullDataView.byteOffset);        // 0
alert(fullDataView.byteLength);        // 16
alert(fullDataView.buffer === buf);   // true
// 构造函数接收一个可选的字节偏移量和字节长度
// byteOffset=0 表示视图从缓冲起点开始
// byteLength=8 限制视图为前8 个字节
const firstHalfDataView = new DataView(buf, 0, 8);
alert(firstHalfDataView.byteOffset);        // 0
alert(firstHalfDataView.byteLength);        // 8
alert(firstHalfDataView.buffer === buf);   // true
// 如果不指定,则DataView会使用剩余的缓冲
// byteOffset=8 表示视图从缓冲的第9 个字节开始
// byteLength未指定,默认为剩余缓冲
const secondHalfDataView = new DataView(buf, 8);
alert(secondHalfDataView.byteOffset);        // 8
alert(secondHalfDataView.byteLength);        // 8
alert(secondHalfDataView.buffer === buf);   // true

上一篇文章:JavaScript迭代与归并方法大全

更多资源请关注公众号:【全面资源集

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐