在 ES6 中我们学习了许多新的语言特性和 API,其中有一些很常用的用于处理数据的 API,比如 TypedArray 和 ArrayBuffer。而在 ECMAScript 2016(ES7)中,又新增了一个 API:ArrayBuffer.transfer(),它能够更好地处理 ArrayBuffer 中的数据。
ArrayBuffer 简介
ArrayBuffer 是 ECMAScript 标准中新增的一种类型,它表示一个二进制数据块。在 ES6 中,我们通过 TypedArray 来操作 ArrayBuffer,而在 ES7 中,ArrayBuffer 被增加了一个新方法:transfer()。
ArrayBuffer.transfer() 方法
ArrayBuffer.transfer() 方法可以将一个 ArrayBuffer 对象的所有数据拷贝到一个新的 ArrayBuffer 中,然后将原 ArrayBuffer 对象清空。使用 ArrayBuffer.transfer() 有一些好处:
- 可以避免手动拷贝 BinaryData 消耗性能。
- 可以保证原 ArrayBuffer 对象的内存被回收。
ArrayBuffer.transfer() 方法有两个参数:
source
:需要拷贝的 ArrayBuffer 对象。length
:新的 ArrayBuffer 对象的长度,可以比原 ArrayBuffer 对象的长度小,但不可以大于原 ArrayBuffer 对象的长度。
使用 ArrayBuffer.transfer()
下面我们来看一段代码,使用 ArrayBuffer.transfer() 方法:
-- -------------------- ---- ------- --- ------- - --- --------------- --- ----- - --- ------------------ ----------------- ----- ----------------- ----- --- ------- - ----------------------------- --- --- ----- - --- ------------------ ------------------------------- -- --- ------------------------------- -- --- ------------------------------- -- ---展开代码
这个例子中,我们首先创建了一个 8 个字节长的 ArrayBuffer 对象,然后使用 DataView 将其划分为两个 Int32 类型的数据,并分别初始化为 100 和 200。接着我们使用 ArrayBuffer.transfer() 方法将原来的 ArrayBuffer 对象创建一个新的长度为 4 的 ArrayBuffer 对象,并将数据拷贝到其中。最后我们创建了一个 DataView 实例 view2,并从中读取数据,发现它符合我们的预期。
注意事项
ArrayBuffer.transfer() 方法有以下几个注意事项:
source
参数必须是 ArrayBuffer 对象。length
参数必须是一个正整数。length
参数不能大于source.byteLength
属性值。
总结
ECMAScript 2016(ES7)中,新增了一个非常有用的 API:ArrayBuffer.transfer() 方法,它可以更好地处理 ArrayBuffer 中的数据。使用 ArrayBuffer.transfer() 可以避免手动拷贝 BinaryData 消耗性能,并且可以保证原 ArrayBuffer 对象的内存得到回收。但需要注意使用方法和参数,否则可能会出现问题。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64a5510548841e98941da0a6