zne*_*eak 24 javascript typed-arrays
我正在使用ArrayBuffer对象,我想复制它们.虽然这对于实际指针来说相当容易memcpy,但我在Javascript中找不到任何直接的方法.
现在,这是我复制我的方式ArrayBuffers:
function copy(buffer)
{
var bytes = new Uint8Array(buffer);
var output = new ArrayBuffer(buffer.byteLength);
var outputBytes = new Uint8Array(output);
for (var i = 0; i < bytes.length; i++)
outputBytes[i] = bytes[i];
return output;
}
Run Code Online (Sandbox Code Playgroud)
有更漂亮的方式吗?
Gle*_*eno 41
我更喜欢以下方法
function copy(src) {
var dst = new ArrayBuffer(src.byteLength);
new Uint8Array(dst).set(new Uint8Array(src));
return dst;
}
Run Code Online (Sandbox Code Playgroud)
chu*_*ckj 26
ArrayBuffer应该支持slice(http://www.khronos.org/registry/typedarray/specs/latest/)所以你可以尝试,
buffer.slice(0);
Run Code Online (Sandbox Code Playgroud)
它适用于Chrome 18但不适用于Firefox 10或11.至于Firefox,您需要手动复制它.您可以slice()在Firefox中进行修补,因为Chrome slice()将胜过手动副本.这看起来像,
if (!ArrayBuffer.prototype.slice)
ArrayBuffer.prototype.slice = function (start, end) {
var that = new Uint8Array(this);
if (end == undefined) end = that.length;
var result = new ArrayBuffer(end - start);
var resultArray = new Uint8Array(result);
for (var i = 0; i < resultArray.length; i++)
resultArray[i] = that[i + start];
return result;
}
Run Code Online (Sandbox Code Playgroud)
然后你可以打电话,
buffer.slice(0);
Run Code Online (Sandbox Code Playgroud)
在Chrome和Firefox中复制阵列.
And*_*rew 23
看来简单地传入源数据视图会执行一个副本:
var a = new Uint8Array([2,3,4,5]);
var b = new Uint8Array(a);
a[0] = 6;
console.log(a); // [6, 3, 4, 5]
console.log(b); // [2, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)
在FF 33和Chrome 36中测试过.