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 回答