ArrayBuffer.transfer
ArrayBuffer.transfer
这是一个实验中的功能
此功能某些浏览器尚在开发中,请参考浏览器兼容性表格以得到在不同浏览器中适合使用的前缀。由于该功能对应的标准文档可能被重新修订,所以在未来版本的浏览器中该功能的语法和行为可能随之改变。
静态ArrayBuffer.transfer()
方法返回一个新的ArrayBuffer, 其内容取自oldBuffer的数据,并且根据 newByteLength 的大小来对数据进行截取或者以0扩展。 如果 newByteLength 未定义,则使用 oldBuffer 的byteLength。这个操作使得 oldBuffer 处于被移除的状态。
语法
ArrayBuffer.transfer(oldBuffer [, newByteLength]
参数
oldBuffer
要转移的ArrayBuffer
对象。
返回值
一个新的ArrayBuffer对象。
描述
ArrayBuffer.transfer()
方法允许你增长和移除 ArrayBuffer
对象。不需复制就能增长一个ArrayBuffer
的功能,对于大的缓冲区来说,有速度优势 (类似realloc) 。当释放底层内存时,移除ArrayBuffer
的功能给开发者提供了显式控制。这避免了必须丢弃所有引用和等待垃圾回收。
示例
var buf1 = new ArrayBuffer(40
new Int32Array(buf1)[0] = 42;
var buf2 = ArrayBuffer.transfer(buf1, 80
buf1.byteLength; // 0 but if you use the polyfill then the value is still 40
buf2.byteLength; // 80
new Int32Array(buf2)[0]; // 42
var buf3 = ArrayBuffer.transfer(buf2, 0
buf2.byteLength; // 0 but if you use the polyfill then the value is still 80
buf3.byteLength; // 0
Polyfill
通过在脚本的开头插入以下代码, 可以部分地解决这一问题, 允许开发者在不支持它的实现中使用transfer () 的大部分功能。虽然这样调用 API不会完全实现其全部功能 , 但它依然可以将数据从一个 ArrayBuffer 传输到另一个 ArrayBuffer。
if (!ArrayBuffer.transfer) {
ArrayBuffer.transfer = function(source, length) {
source = Object(source
var dest = new ArrayBuffer(length
if (!(source instanceof ArrayBuffer) || !(dest instanceof ArrayBuffer)) {
throw new TypeError('Source and destination must be ArrayBuffer instances'
}
if (dest.byteLength >= source.byteLength) {
var nextOffset = 0;
var leftBytes = source.byteLength;
var wordSizes = [8, 4, 2, 1];
wordSizes.forEach(function(_wordSize_) {
if (leftBytes >= _wordSize_) {
var done = transferWith(_wordSize_, source, dest, nextOffset, leftBytes
nextOffset = done.nextOffset;
leftBytes = done.leftBytes;
}
}
}
return dest;
function transferWith(wordSize, source, dest, nextOffset, leftBytes) {
var ViewClass = Uint8Array;
switch (wordSize) {
case 8:
ViewClass = Float64Array;
break;
case 4:
ViewClass = Float32Array;
break;
case 2:
ViewClass = Uint16Array;
break;
case 1:
ViewClass = Uint8Array;
break;
default:
ViewClass = Uint8Array;
break;
}
var view_source = new ViewClass(source, nextOffset, Math.trunc(leftBytes / wordSize)
var view_dest = new ViewClass(dest, nextOffset, Math.trunc(leftBytes / wordSize)
for (var i = 0; i < view_dest.length; i++) {
view_dest[i] = view_source[i];
}
return {
nextOffset : view_source.byteOffset + view_source.byteLength,
leftBytes : source.byteLength - (view_source.byteOffset + view_source.byteLength)
}
}
};
}
规范
Not part of any current specification draft document, but has been proposed for a future ECMA-262 edition.
浏览器兼容性
Feature | Chrome | Edge | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
Basic support | No support | (Yes) | Nightly build | No support | No support | No support |
Feature | Android | Chrome for Android | Edge | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|---|
Basic support | No support | No support | (Yes) | Nightly build | No support | No support | No support |