复制ArrayBuffer对象最直接的方法是什么?

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)

  • @DanNissenbaum因为IE无能为力! (3认同)
  • 看起来你的答案是[最快的选择](http://jsperf.com/clone-float32array). (2认同)

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中复制阵列.

  • 请注意,`subarray()`在现有缓冲区上返回一个新视图,并不实际复制缓冲区. (7认同)
  • 请注意,“slice()”的开始参数是可选的,因此您可以简单地使用“buffer.slice()”。 (2认同)

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中测试过.

  • 需要注意的事项:`new Uint8Array(a.buffer)`不*复制缓冲区.根据您的需要,这可能很有用.当使用ArrayBuffer调用时,它还接受可选的`byteOffset`和`length`参数.这与节点v6中NodeJS的"Buffer.from(Buffer,byteOffset,length)"非常相似. (3认同)