ArrayBuffer.прототип.нарезать прокладку для IE?


Internet Explorer не реализует ArrayBuffer.prototype.slice. Удивительно, но они не планируют реализовать его в ближайшее время. Таким образом, существуют ли какие-либо прокладки для этой функции? Если нет, то это будет канонический ответ в интернете, как только я или кто-то другой реализует его.

2 3

2 ответа:

Это, кажется, делает трюк. Открыт для предложений.

if (!ArrayBuffer.prototype.slice) {
    //Returns a new ArrayBuffer whose contents are a copy of this ArrayBuffer's
    //bytes from `begin`, inclusive, up to `end`, exclusive
    ArrayBuffer.prototype.slice = function (begin, end) {
        //If `begin` is unspecified, Chrome assumes 0, so we do the same
        if (begin === void 0) {
            begin = 0;
        }

        //If `end` is unspecified, the new ArrayBuffer contains all
        //bytes from `begin` to the end of this ArrayBuffer.
        if (end === void 0) {
            end = this.byteLength;
        }

        //Chrome converts the values to integers via flooring
        begin = Math.floor(begin);
        end = Math.floor(end);

        //If either `begin` or `end` is negative, it refers to an
        //index from the end of the array, as opposed to from the beginning.
        if (begin < 0) {
            begin += this.byteLength;
        }
        if (end < 0) {
            end += this.byteLength;
        }

        //The range specified by the `begin` and `end` values is clamped to the 
        //valid index range for the current array.
        begin = Math.min(Math.max(0, begin), this.byteLength);
        end = Math.min(Math.max(0, end), this.byteLength);

        //If the computed length of the new ArrayBuffer would be negative, it 
        //is clamped to zero.
        if (end - begin <= 0) {
            return new ArrayBuffer(0);
        }

        var result = new ArrayBuffer(end - begin);
        var resultBytes = new Uint8Array(result);
        var sourceBytes = new Uint8Array(this, begin, end - begin);

        resultBytes.set(sourceBytes);

        return result;
    };
}

Слегка адаптирована в соответствии с комментариями версии Индекса.js из Arraybuffer-slice GitHub repo ттаубера

if (!ArrayBuffer.prototype.slice) {
  ArrayBuffer.prototype.slice = function (begin, end) {
    var len = this.byteLength;
    begin = (begin|0) || 0;
    end = end === (void 0) ? len : (end|0);

    // Handle negative values.
    if (begin < 0) begin = Math.max(begin + len, 0);
    if (end < 0) end = Math.max(end + len, 0);

    if (len === 0 || begin >= len || begin >= end) {
      return new ArrayBuffer(0);
    }

    var length = Math.min(len - begin, end - begin);
    var target = new ArrayBuffer(length);
    var targetArray = new Uint8Array(target);
    targetArray.set(new Uint8Array(this, begin, length));
    return target;
  };
}