What's the most straightforward way to copy an ArrayBuffer object?

javascript, typed-arrays

Solution

`ArrayBuffer` is supposed to support `slice` (http://www.khronos.org/registry/typedarray/specs/latest/) so you can try,

buffer.slice(0);

which works in Chrome 18 but not Firefox 10 or 11. As for Firefox, you need to copy it manually. You can monkey patch the `slice()` in Firefox because the Chrome `slice()` will outperform a manual copy. This would look something like,

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;
    }

Then you can call,

buffer.slice(0);

to copy the array in both Chrome and Firefox.

Problem

I'm working with `ArrayBuffer` objects, and I would like to duplicate them. While this is rather easy with actual pointers and `memcpy`, I couldn't find any straightforward way to do it in Javascript. Right now, this is how I copy my `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; } ``` Is there a prettier way?

Original source