2012-07-19 36 views
2

我有一個Uint8Array我想使用slice方法。如何傳遞參數並應用於函數?

所以我趁着陣列片的方法是這樣的:

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

現在我希望外包這樣的一些常用功能。

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

嘗試過,但顯然我誤解了它是如何真正起作用。任何人都可以向我解釋這一點,以及如何實現它的工作?

+1

'utils.slice.call(array,start,end)'。 – 2012-07-19 13:20:22

+0

@Rocket我最近發表了我的最後一條評論,這實際上也是一個很好的解決方案,但我想保留它作爲方法集合,並用'.call'調用它會令人困惑。但是,謝謝,幫助我瞭解很多JavaScript! – 2012-07-19 13:29:50

回答

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

注意

注:請記住,這是創建對現有緩衝區的新看法;新對象內容的更改將影響原始對象,反之亦然。

可能是這種情況,這就是你想要的 - 我敢打賭它更有效率 - 如果你不需要複製數據,那就是!

+0

啊,我現在明白了這個問題!感謝您的解釋:) – 2012-07-19 13:22:21

+1

@DanLee:很高興爲您服務!你可能想看看我的關於「子數組」的說明。 – 2012-07-19 13:36:06

+0

@Linus_G_Thiel:太棒了!爲什麼我不像你一樣好奇?非常感謝您的意見,對我來說意義重大。現在我會深入挖掘 – 2012-07-19 13:45:09