2

メソッドUint8Arrayを使用したい があります。slice

そこで、次のような配列スライス メソッドを利用しました。

Array.prototype.slice.call(array, start, end);

今、私はこのようなよく使われる機能をアウトソーシングしたいと考えています。
で試してみました

var utils = {
   slice: function() {
     return Array.prototype.slice.apply(this, arguments);
   }
};

しかし、どうやらそれが実際にどのように機能するかを誤解していたようです。誰かが私にこれを説明し、それを達成して機能させる方法を説明できますか?

4

1 に答える 1

3

あなたの問題は、それthisがあなたが思っているものではないことにあります。お電話いただければutils.slice(foo, 1, 2)thisとなりますutils

呼び出し方に応じて、操作するオブジェクトを最初の引数として渡すことができます。次に、次のようにします。

var utils = {
   slice: function() {
     // The object we're operating on
     var self = arguments[0];
     // The rest of the arguments
     var args = Array.prototype.slice.call(arguments, 1);

     return Array.prototype.slice.apply(self, args);
   }
};

使用法:

var someSlice = utils.slice(someArray, 2, 14);

別の (おそらくより明確な) オプションは、名前付き引数を使用することです。

var utils = {
    slice: function(array, from, to) {
        return Array.prototype.slice.call(array, from, to);
    }
};

これは同じように機能します。

更新:Uint8Arrayに がない理由が気sliceになり、次のことを知りましたsubarray

Int8Array subarray(
  long begin,
  optional long end
);

ご了承ください

注: これは、既存のバッファーに新しいビューを作成していることに注意してください。新しいオブジェクトのコンテンツへの変更は元のオブジェクトに影響を与え、その逆も同様です。

データをコピーする必要がない場合、これはあなたが望むものかもしれません-私はそれがはるかに効率的であることに賭けています-つまり!

于 2012-07-19T13:17:30.087 に答える